获取数据库连接(普普通通方式和数据源的方式)
获取数据库连接(普通方式和数据源的方式)
第一步:创建一个JavaWeb工程,工程名为DBConnPrjTest(此工程名是变量)
第二步:在DBConnPrjTest\WebRoot\WEB-INF\lib下,加入以下包,并加载到工程中:
- commons-logging-1.1.1.jar
- ojdbc14.jar:oracle数据库的jdbc驱动包
- proxool-0.9.1.jar:目前市面上三个主流连接池从性能上排名如下:proxool>c3p0>dbcp,proxool还提供了可视化的连接池实时监控工具,所以既稳定又方便,配置也是非常容易的事情
- proxool-cglib.jar
- 可以从http://proxool.sourceforge.net/站点上下载我们需要的资源,proxool-0.9.1是最新版本,解压后从lib下copy里面的2个JAR包 proxool-0.9.1.jar和 proxool-cglib.jar至项目中的DBConnPrjTest\WebRoot\WEB-INF\lib目录下。如果不加proxool-cglib.jar的话会报 java.lang.ClassNotFoundException:org.logicalcobwebs.cglib.proxy.Callback异
第三步:在DBConnPrjTest\src\conf下,创建以下两个配置文件:
- DBConfig.properties:用于普通方式获取数据库连接
- proxool.xml:用于数据源方式获取数据库连接
DBConfig.properties
driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@db_ip:db_port:db_sid user=db_username password=db_password
proxool.xml
<?xml version="1.0" encoding="UTF-8"?> <myPool> <proxool> <!--数据源的别名--> <alias>DataSource</alias> <!--url连接串--> <driver-url>jdbc:oracle:thin:@192.168.2.36:1521:orcl</driver-url> <!--驱动类--> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!-- 驱动属性 --> <driver-properties> <!-- 用户名 --> <property name="user" value="cms" /> <!-- 密码 --> <property name="password" value="temobi" /> </driver-properties> <!-- 允许最大连接数(默认5个),超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定--> <maximum-connection-count>60</maximum-connection-count> <!-- 最小连接数(默认2个)--> <minimum-connection-count>5</minimum-connection-count> <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒--> <house-keeping-sleep-time>120000</house-keeping-sleep-time> <!--用于保持连接的测试语句 --> <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql> <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--> <!-- 以下配置已经不推荐使用了,用simultaneous-build-throttle代替 --> <!-- <maximum-new-connections>10</maximum-new-connections> --> <!-- 某一时间点的最大连接数数--> <simultaneous-build-throttle>50</simultaneous-build-throttle> <!--最少保持的空闲连接数(默认2个)--> <prototype-count>0</prototype-count> <!--在使用之前测试--> <test-before-use>true</test-before-use> <!-- 连接最大生命时间 默认4小时 单位:秒--> <maximum-connection-lifetime>600000</maximum-connection-lifetime> <!-- 连接最大时间活动 默认5分钟 单位:秒--> <maximum-active-time>600000</maximum-active-time> </proxool> </myPool>
第四步:创建java类:
- 在DBConnPrjTest\src\com\jdbc下,创建ConnectionUtil.java
- 在DBConnPrjTest\src\com\proxool下,创建ConnectionManager.java,ConnectionTool.java,DBResourceHelper.java
ConnectionUtil.java
/* * 文 件 名: ConnectionUtil.java * 描 述: 普通方式的数据库连接工具类 * 修 改 人: Administrator */ package com.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; /** * 数据库连接工具类 * @author Administrator */ public class ConnectionUtil { /** * 写死数据库连接的相关信息,从而获取连接 */ public Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/jdbc_db", "root", "mysqladmin"); return conn; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 通过传参的方式获取数据库连接 * @param driver 数据库驱动类型 * @param url 数据库连接字符串 * @param user 数据库用户 * @param password 数据库密码 */ public Connection getConnection(String driver, String url, String user, String password) { Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, password); return conn; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 通过读取properties文件配置信息,来获取数据库连接 */ public Connection openConnection() { String driver = ""; String url = ""; String user = ""; String password = ""; //Properties 类表示了一个持久的属性集。 //Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 Properties prop = new Properties(); Connection conn = null; try { //将DBConfig.properties文件的属性列表输出到指定的输出流 prop.load(this.getClass().getClassLoader().getResourceAsStream( "conf/DBConfig.properties")); driver = prop.getProperty("driver"); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); Class.forName(driver); conn = DriverManager.getConnection(url, user, password); return conn; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { ConnectionUtil cu = new ConnectionUtil(); System.out.println("数据库连接: "+ cu.openConnection()); } }
ConnectionManager.java
/* * 文 件 名: ConnectionManager.java * 描 述: 连接池方式的数据库连接管理类 * 修 改 人: Administrator */ package com.proxool; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.logicalcobwebs.proxool.ProxoolDataSource; import org.logicalcobwebs.proxool.ProxoolException; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; /** * 数据库连接管理类 * * @author Administrator */ public class ConnectionManager { private static final String ALIAS = "DataSource"; private static ProxoolDataSource cmsds = null; static { initDataSource(); } /** * 初始化数据源 */ private static boolean initDataSource() { InputStreamReader reader = null; try { // 实例化一个File对象 File proxoolFile = new File( "E:/workspace/DBConnPrjTest/src/conf/proxool.xml"); if (proxoolFile.exists()) { reader = new InputStreamReader(new FileInputStream(proxoolFile)); } else { reader = new InputStreamReader( Thread .currentThread() .getContextClassLoader() .getResourceAsStream( "E:/workspace/DBConnPrjTest/src/conf/proxool.xml")); } // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 JAXPConfigurator.configure(reader, false); // 要据proxool中的数据源别名,实例化一个数据源对象 cmsds = new ProxoolDataSource(ALIAS); return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { if (reader != null) { try { reader.close(); } catch (Exception e) { e.printStackTrace(); } } } } /** * 取连接 */ public static Connection getConnection1() { if (cmsds == null) { return null; } try { return cmsds.getConnection(); } catch (Exception e) { e.printStackTrace(); } return null; } public static Connection getConnection2() { Connection conn = null; try { // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 JAXPConfigurator.configure( "E:/workspace/DBConnPrjTest/src/conf/proxool.xml", false); // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的DataSource,参数格式为:proxool.数据源的别名 conn = DriverManager.getConnection("proxool.DataSource"); } catch (ProxoolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void main(String[] args) { try { // System.out.println(cmsds); // System.out.println("连接:" + cmsds.getConnection()); // System.out.println(ConnectionManager.getConnection1()); // ProxoolFacade.shutdown(); System.out.println(ConnectionManager.getConnection2()); // ProxoolFacade.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
ConnectionTool.java
/* * 文 件 名: ConnectionTool.java * 描 述: 连接池方式的数据库连接工具类 * 修 改 人: Administrator */ package com.proxool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.logicalcobwebs.proxool.ProxoolException; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; /** * 数据库连接工具类 * @author Administrator */ public class ConnectionTool { public static Connection getConnection() { Connection conn = null; try { // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 JAXPConfigurator.configure( "E:/workspace/DBConnPrjTest/src/conf/proxool.xml", false); // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的DataSource,参数格式为:proxool.数据源的别名 conn = DriverManager.getConnection("proxool.DataSource"); } catch (ProxoolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void main(String[] args) { System.out.println(ConnectionTool.getConnection()); } }
DBResourceHelper.java
/* * 文 件 名: DBResourceHelper.java * 描 述: 数据库资源的帮助类 * 修 改 人: Administrator */ package com.proxool; import java.sql.*; /** * 关闭数据库资源 * * @author Administrator */ public class DBResourceHelper { private DBResourceHelper() { } /** * 关闭连接 */ static public void closeConnection(Connection conn) { if (conn != null) { try { conn.close(); } catch (Exception e) { } } } /** * 关闭执行静态 SQL 语句所生成的结果对象 */ static public void closeStatement(Statement stat) { if (stat != null) { try { stat.close(); } catch (Exception e) { } } } /** * 关闭结果集对象 */ static public void closeResultSet(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (Exception e) { } } } /** * 回滚 */ static public void rollbackConnection(Connection conn) { if (conn != null) { try { conn.rollback(); } catch (Exception e) { } } } /** * 自动提交 */ static public void setConnectionAutoCommit(Connection conn, boolean autoCommit) { if (conn != null) { try { conn.setAutoCommit(autoCommit); } catch (Exception e) { } } } }