整理自文章:http://www.cnblogs.com/lijiews/p/3529906.html
现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSource的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池 (Tomcat内置)
C3P0 数据库连接池(Spring内置)
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。
备注:简单地讲,使用开源数据源,就是为了获取其DataSource对象,然后通过该对象动态的地获取数据库连接。
DBCP数据源:
DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
使用DBCP示例代码:
static{
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties prop = new Properties();
prop.load(in);
BasicDataSourceFactory factory = new BasicDataSourceFactory();
dataSource = factory.createDataSource(prop);
}
Demo样例1:JDBC 数据库连接池 由应用程序独立使用。
1 public class JdbcUtils_DBCP { 2 private static DataSource ds = null; 3 static{ 4 try{ 5 InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("2013-06-10 11:26"); 6 Properties prop = new Properties(); 7 prop.load(in); 8 BasicDataSourceFactory factory = new BasicDataSourceFactory(); 9 ds = factory.createDataSource(prop); 10 }catch (Exception e) { 11 throw new ExceptionInInitializerError(e); 12 } 13 } 14 public static Connection getConnection() throws SQLException{ 15 return ds.getConnection(); 16 } 17 public static void release(Connection conn,Statement st,ResultSet rs){ 18 if(rs!=null){ 19 try{ 20 rs.close(); //throw new 21 }catch (Exception e) { 22 e.printStackTrace(); 23 } 24 rs = null; 25 } 26 if(st!=null){ 27 try{ 28 st.close(); 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32 st = null; 33 } 34 if(conn!=null){ 35 try{ 36 conn.close(); 37 }catch (Exception e) { 38 e.printStackTrace(); 39 } 40 } 41 } 42 }
Demo样例2: dbcpconfig.properties 文件的内容(也可参见附件)
1 #连接设置 2 driverClassName=com.mysql.jdbc.Driver 3 url=jdbc:mysql://localhost:3306/day16 4 username=root 5 password=root 6 7 #<!-- 初始化连接 --> 8 initialSize=10 9 #最大连接数量 10 maxActive=50 11 #<!-- 最大空闲连接 --> 12 maxIdle=20 13 #<!-- 最小空闲连接 --> 14 minIdle=5 15 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> 16 maxWait=60000 17 18 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 19 #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 20 connectionProperties=useUnicode=true;characterEncoding=utf8 21 22 #指定由连接池所创建的连接的自动提交(auto-commit)状态。 23 defaultAutoCommit=true 24 25 #driver default 指定由连接池所创建的连接的只读(read-only)状态。 26 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) 27 defaultReadOnly= 28 29 #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 30 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 31 defaultTransactionIsolation=READ_COMMITTED
8、DBCP数据源与应用服务器整合使用—— 配置Tomcat数据源
查看Tomcat文档(Tomcat-->TomcatDocument-->JNDI Resources-->定位到JDBC Data Sources),示例代码:
<Context>
<Resource name="jdbc/datasource" auth="Container" type="javax.sql.DataSource"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jdbc" maxActive="8" maxIdle="4" />
<Resource name="jdbc/EmployeeDB " auth="Container" type="javax.sql.DataSource"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jdbc" maxActive="8" maxIdle="4" />
</Context>
放置位置:在MyEclipse中,在目录/META-INF/下创建文件context.xml,将上述内容粘贴其中(注:不要写XML文件的指令头句)。该文件将被发布到Tomcat服务器的conf\Catalina\localhost目录中,并以工程名称 命名该文件。
下面是调用JNDI,获取存储在JNDI容器中的资源的固定格式代码(有关JNDI的知识,参见下一章节):
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/datasource");
特别提醒:此种配置下,驱动jar文件需放置在tomcat的lib下
可以创建工具类JDBCUtils,java来封装上面获取连接的代码。
Demo样例: 封装JNDI调用DataSource 获取连接的代码。
1 public class JdbcUtils_Tomcat { 2 private static DataSource ds; 3 static { 4 try { 5 Context initCtx = new InitialContext(); 6 Context envCtx = (Context) initCtx.lookup("java:comp/env"); 7 ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 8 } catch (Exception e) { 9 throw new RuntimeException(e); 10 } 11 } 12 public static Connection getConnection() throws SQLException{ 13 return ds.getConnection(); 14 } 15 }