概念:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个连接;释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。 需要注意: 1. 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量数据库连接资源被浪费。 2. 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。 数据库连接池的两个任务: 1. 限制每个应用或系统可以拥有的最大资源,也就是确定连接池的大小(PoolSize)。 2. 在连接池的大小(PoolSize)范围内、最大限度地使用资源,缩短数据库访问的使用周期。 例如: 物理连接数200个,每个连接提供250个Statemet,那么并发的Statement总数为200*250=50000个。 Java开源连接池: Jakarta DBCP 可直接在应用程序中使用。(比较常用,集成在Tomcat和Struts中) C3P0是Hibernate的默认数据库连接池。(常用,Hibernate) 其他的还有Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager。 DBCP代码实现: //创建数据源 public static DataSource setupDataSource(String connectURI) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName(org.gjt.mm.mysql.Driver); ds.setUsername("username"); ds.setPassword("password"); ds.setUrl(connectURI); return ds; } //关闭数据源 public static void shutdownDataSource(DataSource ds) throws SQLException { BasicDataSource bds = (BasicDataSource)ds; bds.close(); } //数据源的使用 DataSource dataSource = getDataSource(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); pstmt = conn.prepareStatement("select * from users"); rs = pstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("id")); } } catch(Exception e) { e.printStackTrace(); } finally { try { rs.close(); pstmt.close(); conn.close(); } catch(Exception ex) { ex.printStackTrace(); } } 在Tomcat中配置数据库连接池: 我们使用Tomcat中lib文件夹下的tomcat-dbcp.jar。 1. 修改server.xml文件在<Service>中写入以下代码: <Context path="/WebProject" docBase="WebProject" reloadable="true" crossContext="true"> <Resource auth="Container" name="jdbc/CompanyDB" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DataBaseName=Company" username="sa" password="root" maxActive="100" maxIdle="30" maxWait="10000" removeAbandoned=“true” removeAbandonedTimeOut="10" logAbandoned="true"/> </Context> path:工程路径。 docBase:工程名字。 name:JNDI的名字。 type:数据源的类。 factory:指定生成的DataReource的factory类名;默认DBCP工厂类。 driverClassName:数据库驱动名。 url:数据库连接的URL。 username:数据库用户名。 password:数据库密码。 maxActive:最大连接数据库数,设为0表示没有限制。 maxIdle:最大等待数量,设为0表示没有限制。 maxWait:最大等待秒数,单位为ms。 removeAbandoned:是否自我中断,默认为false。 removeAbandonedTimeOut:几秒后会自我中断,removeAbandoned必须为true。 logAbandoned:是否记录中断事件,默认为false。 2. 修改web.xml文件,增加一个标签,输入以下代码: <resource-ref> <description>Company Connection</description> <res-ref-name>jdbc/CompanyDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> res-ref-name:指定JNDI的名字。 res-type:指定资源类名。 res-auth:指定资源的Manager。 3. 代码中使用JNDI代码进行获取: Context ctx = new InitalContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB"); Connection conn = ds.getConnection(); 注意:java:comp/env/ 是java中JNDI固定写法。 |
|