JDBC:管理驱动、与数据库建立连接、执行SQL语句、处理结果
数据库连接池:程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
数据库连接池运行机制
1、从连接池获取或创建可用连接;
2、使用完毕之后,把连接返还给连接池;
3、在系统关闭前,断开所有连接并释放连接占用的系统资源;
4、还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值;
常用的数据库连接池
(1)JNDI(Java Naming and Directory Interface ):是SUN公司提供的一种标准的Java命名系统接口,是一组在Java应用中访问命名和目录服务的API。命名服务是将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。
(2)C3P0:连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。
(3)DBCP(DataBase connection pool):是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar
<Context> <Resource name="jdbc/test" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxIdle="8" maxWait="5000" url="jdbc:mysql://localhost:3306/test" maxActive="15" initialSize="10"/> </Context>
<%
try {
InitialContext context=new InitialContext();
DataSource ds=(DataSource)context.lookup("java:/comp/env/jdbc/test");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet set = stmt.executeQuery("SELECT id,name,age FROM user");
while(set.next())
{
out.println(set.getString("name"));
}
BasicDataSource dbs=(BasicDataSource)ds;
out.print(dbs.getNumIdle()+"<br>");
out.print(dbs.getNumActive());
} catch(NamingException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
%>
<Resource auth="Container" description="DB Connection" driverClass="com.mysql.jdbc.Driver" maxPoolSize="10" minPoolSize="2" acquireIncrement="2" name="jdbc/mysqlDB" user="root" password="123123" factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource" jdbcUrl="jdbc:mysql://localhost:3306/mldn?autoReconnect=true" />
<Context> <ResourceLink name="jdbc/mysqlDB" global="jdbc/mysqlDB" type="javax.sql.DataSource"/> </Context>
<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/mysqlDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
<%
Connection conn=null;
try
{
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysqlDB");
conn=ds.getConnection();
}catch(NamingException ex)
{
ex.printStackTrace();
}
String sql="select * from user";
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while(rs.next())
{
%>
字段1:<%=rs.getString(1)%> 字段2:<%=rs.getString(2)%><br />
<%
}
if(rs!=null)
{
rs.close();
rs=null;
}
if(ps!=null)
{
ps.close();
ps=null;
}
if(conn!=null)
{
conn.close();
conn=null;
}
%>
public class DBCPTest {
private static BasicDataSource bds = null;
private static ConnectionFactory cf = null;
static{
bds = new BasicDataSource();
bds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
bds.setUrl("jdbc:sqlserver://127.0.0.1:1433;databaseName=AjaxDb");
bds.setInitialSize(10);
bds.setMaxActive(4);
bds.setMaxWait(5000);
bds.setUsername("sa");
bds.setPassword("Zzx198461");
cf = new DataSourceConnectionFactory(bds);
}
public static Connection getConnection() throws SQLException{
return cf.createConnection();
}
public static void destroy() throws SQLException{
cf = null;
bds.close();
bds = null;
}
public static void main(String[] args) throws Exception{
System.out.println(DBCPTest.getConnection());
}
}
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name=“JNDI名" auth="Container" type=“javax.sql.DataSource” username=“用户名” password=“密码" driverClassName=“驱动类" url=“数据连接字符串" maxActive="8" maxIdle="4"/> </Context>
<!– 声名工程所需资源--> <resource-ref> <!– JDNI资源名 --> <res-ref-name>connpool</res-ref-name> <!– 资源类型 --> <res-type>javax.sql.DataSource</res-type> <!– 资源范围 --> <res-auth>Container</res-auth> </resource-ref>
public class DBUtil {
private DBUtil() {
}
public static Connection getConn() throws Exception {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)
envCtx.lookup("connpool");
return ds.getConnection();
}
}
<Context path="/YouWeb" docBase="F:\workspace\tea_forum\WebRoot"> <Resource name="jdbc/sqlserver" type="javax.sql.DataSource" driverClassName="sun.jdbc.odbc.JdbcOdbcDriver" maxIdle="2" maxWait="5000" username="sa" password="sa" url="jdbc:odbc:accp" maxActive="4"/> </Context>
<Resource name="jdbc/mssql" type="javax.sql.DataSource" driverClassName="sun.jdbc.odbc.JdbcOdbcDriver" maxIdle="2" maxWait="5000" username="sa" password="sa" url="jdbc:odbc:accp" maxActive="4"/>
<Context path="/testjndi1" docBase="F:\workspace\testpool\WebRoot" > <ResourceLink name="jdbc/mssql1" global="jdbc/mssql" type="javax.sql.DataSource"/> </Context> <Context path="/testjndi2" docBase="F:\workspace\testpool2\WebRoot"> <ResourceLink name="jdbc/sqlserver2" global="jdbc/mssql" type="javax.sql.DataSource"/> </Context>
<!--注意:res-ref-name节点里的名字要与上面的Resource节点里的name要一致。名字可以任意取,但一定要一致。--> <resource-ref> <res-ref-name>jdbc/sqlserver</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
<%
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/sqlserver");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {%>
<br><%=rs.getString(1)%>
<%}
out.print("<br>Successful!成功!!\n");%>
<%
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
out.print("出现例外!" + e.getMessage());
e.printStackTrace();
}
<Context> <Resource name="jdbc/sqlserver" type="javax.sql.DataSource" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;databaseName=zf" username="sa" password="sa" /> </Context>
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/server");
Connection conn = ds.getConnection();