配置JDBC连接池
连接池 现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。也有一些开源组织提供了数据源的独立实现: DBCP 数据库连接池(tomcat):DBCP 是 Apache 软件基
·
连接池
现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池(tomcat):DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下3个 jar 文件:
commons-dbcp.jar:连接池的实现
commons-pool.jar: 连接池实现的依赖类
commons-collections.jar :连接池实现的集合类
连接属性设置:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydb2
username=root
password=root
url=jdbc:mysql://127.0.0.1:3306/mydb2
username=root
password=root
//测试连接池DBCP的用法
public class Demo2 {
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis();
//加载属性文件
InputStream is = Demo2.class.getClassLoader().getResourceAsStream("cn/itcast/web/jdbc/config/dbcp.properties");
Properties props = new Properties();
props.load(is);
//创建DBCP连接池工厂
BasicDataSourceFactory factory = new BasicDataSourceFactory();
//创建数据源,即连接池
DataSource ds = factory.createDataSource(props);
for(int i=1;i<=50000;i++){
//从连接池中取得一个空闲的连接对象
Connection conn = ds.getConnection();
if(conn!=null){
System.out.println(i+":取得连接");
}
//将连接对象还回给连接池
conn.close();
}
long end = System.currentTimeMillis();
System.out.println("共用" + (end-begin)/1000+"秒");
}
}
C3P0 数据库连接池(hibernate):
//测试连接池C3P0的用法
public class Demo3 {
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis();
//创建C3P0连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
for(int i=1;i<=100000;i++){
Connection conn = dataSource.getConnection();
if(conn!=null){
System.out.println(i+":取得连接");
conn.close();
}
}
long end = System.currentTimeMillis();
System.out.println("共用" + (end-begin)/1000+"秒");
}
}
2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行
3)项目中,对于Connection来说,不会直接使用DriverManager取得,而使用连接池方式。
4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
*6)C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时
会自动在指定的目录下找xml文件,并加载默认设置
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb2</property>
</default-config>
</c3p0-config>
JNDI技术简介:
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
这套API的主要作用在于:它可以把DataSource对象放在一个Tomcat容器中(JNDI容器),并为容器中的DataSource对象取一个名称,以后程序想获得DataSource对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
这套API的主要作用在于:它可以把DataSource对象放在一个Tomcat容器中(JNDI容器),并为容器中的DataSource对象取一个名称,以后程序想获得DataSource对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
JNDI和在tomcat中配置DBCP连接池
a)JNDI是Java命名和目录接口,不同的Web服务器有着不同的实现b)不同进程之间,可不同机器之间访问,叫远程访问
c)JNDI和JDBC一样,都属于JavaEE规则之一
d)基于tomcat如何配置DBCP连接池
>>修改tomcat/conf/context.xml文件
>>加入DB相关的jar包到tomcat/lib目录下
>>重新启动tomcat服务器
e)访问tomcat服务器的JNDI代码如下,是固定的:
Context tomcatContext = (Context) context.lookup("java:comp/env");
//通过JNDI远程访问Tomcat服务器中的DBCP连接池
public class JndiServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
try {
//创建具体Web服务器的JNDI对象
Context context = new InitialContext();
//远程查找Web服务器
Context tomcatContext = (Context) context.lookup("java:comp/env");
//在Web服务器内远程查找DBCP连接池服务
DataSource ds = (DataSource) tomcatContext.lookup("tomcatDS");
//从DBCP连接池中取得一个空闲的连接
Connection conn = ds.getConnection();
//显示结果
if(conn!=null){
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("取得连接");
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)