[数据库连接池二]Java数据库连接池--C3P0和JDNI.
前言:上一篇文章中讲了DBCP的用法以及实现原理,这一篇再来说下C3P0和JDNI的用法.? C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0数据源在项目开发中使用得比较多。 1.导入相关jar包??? c3p0-0.9.2-pre1.jar、mchange-commons-0.2.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-0.9.2-pre1.jar 2、在类目录下加入C3P0的配置文件:c3p0-config.xml c3p0-config.xml的配置信息如下: <span style="color: #0000ff;">< <span style="color: #800000;">c3p0-config<span style="color: #0000ff;">><span style="color: #008000;"> <span style="color: #0000ff;"><<span style="color: #800000;">default-config<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">property <span style="color: #ff0000;">name<span style="color: #0000ff;">="driverClass"<span style="color: #0000ff;">>com.mysql.jdbc.Driver<span style="color: #0000ff;"></<span style="color: #800000;">property<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">property <span style="color: #ff0000;">name<span style="color: #0000ff;">="jdbcUrl"<span style="color: #0000ff;">>jdbc:mysql://localhost:3306/jdbcstudy<span style="color: #0000ff;"></<span style="color: #800000;">property<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">property <span style="color: #ff0000;">name<span style="color: #0000ff;">="user"<span style="color: #0000ff;">>root<span style="color: #0000ff;"></<span style="color: #800000;">property<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">property <span style="color: #ff0000;">name<span style="color: #0000ff;">="password"<span style="color: #0000ff;">>XDP<span style="color: #0000ff;"></<span style="color: #800000;">property<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">c3p0-config<span style="color: #0000ff;">> 如下图所示: DataSource dataSource =
Connection getConnection()
(rs!= }
(stmt!= }
(conn!= conn.close();
} }
测试类:UserDaoImpl.java Connection conn = PreparedStatement ps = conn = ps = conn.prepareStatement(""
} } C3P0Utils.closeAll(
}
可以看出只要将配置文件c3p0-config.xml放在classpath中,或classes目录中,然后通过private static DataSource dataSource = new ComboPooledDataSource();就可以自动读取到,确实很方便易用.到了这里我们来看一下这里的源码: DataSource dataSource = ComboPooledDataSource();
ComboPooledDataSource.java wcpds -> dmds
{ (
ComboPooledDataSource(
dmds = wcpds =
{ logger.log(MLevel.WARNING,"Hunh??? This can't happen. We haven't set up any listeners to veto the property change yet!" RuntimeException("Hunh??? This can't happen. We haven't set up any listeners to veto the property change yet! " +
}
具体更多细节 还请大家看下源码了,这里我就不继续往后扩展了. 源码下载地址:? 2.1,JDNI JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包, 这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。 Tomcat服务器创建的数据源是以JNDI资源的形式发布的,所以说在Tomat服务器中配置一个数据源实际上就是在配置一个JNDI资源,通过查看Tomcat文档,我们知道使用如下的方式配置tomcat服务器的数据源: 1
服务器创建好数据源之后,我们的应用程序又该怎么样得到这个数据源呢,Tomcat服务器创建好数据源之后是以JNDI的形式绑定到一个JNDI容器中的,我们可以把JNDI想象成一个大大的容器,我们可以往这个容器中存放一些对象,一些资源,JNDI容器中存放的对象和资源都会有一个独一无二的名称,应用程序想从JNDI容器中获取资源时,只需要告诉JNDI容器要获取的资源的名称,JNDI根据名称去找到对应的资源后返回给应用程序。我们平时做javaEE开发时,服务器会为我们的应用程序创建很多资源,比如request对象,response对象,服务器创建的这些资源有两种方式提供给我们的应用程序使用:第一种是通过方法参数的形式传递进来,比如我们在Servlet中写的doPost和doGet方法中使用到的request对象和response对象就是服务器以参数的形式传递给我们的。第二种就是JNDI的方式,服务器把创建好的资源绑定到JNDI容器中去,应用程序想要使用资源时,就直接从JNDI容器中获取相应的资源即可。 对于上面的name="jdbc/datasource"数据源资源,在应用程序中可以用如下的代码去获取 1 Context initCtx = new InitialContext();
2 Context envCtx = (Context) initCtx.lookup("java:comp/env");
3 dataSource = (DataSource)envCtx.lookup("jdbc/datasource");
此种配置下,数据库的驱动jar文件需放置在tomcat的lib下 1、在Web项目的WebRoot目录下的META-INF目录创建一个context.xml文件 如下图所示: 2、在context.xml文件配置tomcat服务器的数据源 3、将数据库的驱动jar文件需放置在tomcat的lib下 4、在获取数据库连接的工具类(如jdbcUtils)的静态代码块中获取JNDI容器中的数据源
DataSource ds =
Context initCtx =
Context envCtx = (Context) initCtx.lookup("java:comp/env"
ds = (DataSource)envCtx.lookup("jdbc/datasource" }
Connection getConnection()
(rs!=
} rs = (st!=
}
(conn!=
} }
写一个Servlet测试JNDI数据源 JNDITest
Connection conn = PreparedStatement st = ResultSet rs =
conn = String sql = "insert into test1(name) values(?)" st = st.setString(1,"gacl"
rs = System.out.println(rs.getInt(1 } }
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |