按照以前做练习的做法,每次需要使用数据库时,建立连接-完成操作-关闭连接。当访问量少,数据量小的时候,这种办法可行,但是当访问量大的时候性能非常低下,连续插入一百条数据就要6到7秒,大量时间耗费在了与数据库建立连接上。
解决办法之一是使用数据库连接池。思路是当服务器启动是便自动创建好一定数量(可配置)的连接,将这些随时可用的连接放入连接池中。当需要使用的时候直接从连接池中获取,使用完毕后放回池中(此时物理连接还存在,并未断开)。
package com.cto.noticeboard.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class JdbcUtils_JNDI {
private static DataSource ds = null;
//在静态代码块中创建数据库连接池
static{
try{
//初始化JNDI
Context initCtx = new InitialContext();
//得到JNDI容器
Context envCtx = (Context) initCtx.lookup("java:comp/env");
//从JNDI容器中检索name为jdbc/datasource的数据源
ds = (DataSource)envCtx.lookup("jdbc/datasource");
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException{
//从数据源中获取数据库连接
return ds.getConnection();
}
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
//关闭存储查询结果的ResultSet对象
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
//将Connection连接对象还给数据库连接池
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
public static void release(Connection conn,Statement st){
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
//将Connection连接对象还给数据库连接池
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
public long insertSingle(String sql)
{
int count=0;
Connection conn = null;
Statement statement=null;
//TestDBCP db = new TestDBCP("jdbc:mysql://localhost/noticeborad");
try{
conn = JdbcUtils_JNDI.getConnection(); //DBUtil.getInstance().getConnection();
//System.out.println("conn"+conn);
statement = conn.createStatement();
//System.out.println("statemrnt:"+statement);
count=statement.executeUpdate(sql);
//System.out.println(db.getDataSourceStats());
}catch(Exception e){
e.printStackTrace();
}finally{
// DBUtil.close(conn);
JdbcUtils_JNDI.release(conn, statement);
}
return count;
}
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/datasource"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/noticeborad"
initialSize="100"
maxActive="1000"
maxTotal="-1"
maxWaitMillis="-1"
maxIdle="100"/>
</Context>