一、问题引入
在java程序中,需要访问数据库,做增删改查等相关操作。如何访问数据库,做数据库的相关操作呢?
二、Java连接数据库方法概述
java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为“数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driver;oracle的数据库驱动为:oracle.jdbc.driver.oracledriver。
在java程序中访问数据库,做数据库连接时,可以采用两种方式:
1、使用java.sql API
利用该包提供的各种接口和类直接访问数据库。
2、使用数据库连接池
目前存在多个开源的java数据库连接池,这些连接池都是在java.sql基础上编写而成。
Ø 连接池的解决的问题是:
当使用java.sql中提供的api创建数据库连接时候,需要耗费很大的资源,要进行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需要访问数据库时候,都进行数据库连接,那么势必会造成性能低下;同时,如果用户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问题,通过管理连接池中的多个连接对象(connection),实现connection重复利用。从而,大大提高了数据库连接方面的性能。
Ø 该连接池的功能是:
负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空闲状态,以便被别的请求重复利用。同时;数据库连接池负责检查(空闲时间>最大空闲时间)的数据库连接,并释放。
Ø 连接池主要参数介绍
最小连接数:初始化时,系统将负责创建该数目的connection放入连接池中。
最大连接数:系统允许创建connection的最大数值。当系统请求连接时候,且连接池中不存在空闲的连接:如果connection总数未超过最大连接数,那么连接池负责创建新的connection对象,并返回该对象;如果connection总数已经到达该最大连接数,那么连接池将用户请求转入等待队列。
三、常用的数据库连接池
1、JNDI
2、C3p0
3、Apache 的Jakarta DBCP
4、BoneCP
其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式;而bonecp号称是速度最快的数据库连接池。JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。
下面的列表,列出了几种方式的区别和不同:
序号 | 连接名称 | 依赖的jar包 | 实现的datasource类 |
|
1 | JNDI | 该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。程序中不需要引入特别的jar包。 | Javax.sql.datasource |
|
2 | C3P0 | c3p0-0.9.xxx.jar | com.mchange.v2.c3p0.ComboPooledDataSource |
|
3 | DBCP | commons-dbcp.jar,commons-pool.jar | org.apache.commons.dbcp.BasicDataSource |
|
4 | BoneCP
| onecp-0.6.5.jar oogle-collections-1.0.jar slf4j-api-1.5.11.jar sf4j-log4j12-1.5.11.jar og4j-1.2.15.jar | BoneCPDataSource |
|
备注:以上几种方式的数据库连接池的配置参数大同小异,略有差别;其参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置。
四、分别列出几种连接池的编码例子
1、使用java.sql API直接访问数据库
Connection conn;
String driver="";
String url="";
String user;
String pass;
try{
Cass.forName(driver);
Connection conn = DriverManager.getConnection(usrl,user,pass);
}catch(ClassNotFoundException e){}
cacth(SQLException e){}
finally{
try{
if(conn!=null) conn.close();
}catch(SQLException e) {e.printStackTrace();}
}
(1)、修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。
(2)、由于数据源是由tomcat负责创建,所以需要的jdbc驱动应该放到tomcat的lib路径下。
(3)、编写使用java代码,并放在tomcat环境下使用,如下:
try {
Context initcontext=new InitialContext();
Context context=(Context) initcontext.lookup("java:comp/env");
DataSource datasource=(DataSource)context.lookup("jdbc/editortest");
Connection cn=datasource.getConnection();
Statement st=cn.createStatement()
} catch (NamingException e)
e.printStackTrace();
} catch (SQLException e)
e.printStackTrace();
}
在Tomcat安装目录下的conf/context.xml文件中配置。其配置如下:
<Context>
<Resource name="jdbc/****" auth="Container"
type="javax.sql.DataSource" axActive="100" maxIdle="30"
maxWait="10000" uername="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/数据库名"/>
</Context>
3、Apache提供的简单连接池创建数据源
以这种方式创建的数据源就不再是javax.sql.DataSource,而是org.apache.commons.dbcp.BasicDataSource。而且不再需要配置任何文件就可以直接使用。代码如下:
// 创建BasicDataSource对象
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/cheng");
ds.setUsername("root");
ds.setPassword("root");
ds.setInitialSize(50);
ds.setMaxActive(100);
ds.setMaxIdle(30);
ds.setMaxWait(10000);
// 关闭数据源连接
ds.close();
C3P0方式创建数据源
使用C3P0方式创建数据源应该首先准备一个jar文件:c3p0-0.9.1.2.jar,将其放到web/lib目录下,就可以在项目中使用C3P0创建数据源,C3P0创建的数据源对象也不是DataSource对象,而是ComboPooledDataSource,代码如下:
// 创建ComboPooledDataSource对象
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/cheng");
ds.setUser("root");
ds.setPassword("root");
ds.setInitialPoolSize(50);
ds.setMaxPoolSize(100);
ds.setMaxIdleTime(10000);
Proxool方式创建数据源
应该准备的jar文件为:proxool-01.9.0RC3.jar,之后在项目中创建ProxoolDataSource对象,其代码如下:
// 创建ProxoolDataSource对象
ProxoolDataSource ds = new ProxoolDataSource();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setDriverUrl("jdbc:mysql://localhost:3306/cheng");
ds.setUser("root");
ds.setPassword("root");
六、附录:Java开源的数据库连接池
在Java中开源的数据库连接池有以下几种 :
1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection和Statement 池的DataSources 对象。
2,Proxool这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
3,Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
4,DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。
5,DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。
6,XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。
7,Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。
8,SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象,在所设定time-outs之后察觉连接泄漏,追踪连接使用情况,强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。
9,MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。
10,BoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25