DataSource和ConnectionPool的关系:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.userName}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize" value="${jdbc.pool.initialPoolSize}" />
<property name="minPoolSize" value="${jdbc.pool.minPoolSize}" />
<property name="maxPoolSize" value="${jdbc.pool.maxPoolSize}" />
<property name="maxIdleTime" value="${jdbc.pool.maxIdleTime}" />
<property name="idleConnectionTestPeriod" value="${jdbc.pool.idleConnectionTestPeriod}" />
<property name="maxStatements" value="30" />
<property name="acquireIncrement" value="2" />
<property name="acquireRetryAttempts" value="0" />
<property name="preferredTestQuery" value="${jdbc.pool.preferredTestQuery}"/>
</bean>
从这段代码中看出,datasource配置了数据库驱动和数据库地址和连接池信息。
数据源是指数据的来源,比如数据库。连接池是指这样一个“池子”,池子中的每个东西都是连接数据源的一个“连接”,这样别人想连接数据源的时候可以从这个“池子”里取,用完以后再放回来供以后其他想使用的人使用。
我们一般说的数据源指的就是数据库。
tomcat下配置连接池的方法:
1、context.xml + web.xml
连接JDBC的URL格式为jdbc:sqlite:/path。这里的path为指定到SQLite数据库文件的路径.
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource
name="jdbc/mySqlite"
type="javax.sql.DataSource"
driverClassName="org.sqlite.JDBC"
maxIdle="4"
maxWait="5000"
url="jdbc:sqlite://F:/skx_space/java_web/sz_db/myfisrt.db"
maxActive="4"/>
</Context>
<resource-ref>
<res-ref-name>jdbc/mySqlite</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
测试:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.DataSource" %>
<html>
<head>
<title>Tomcat8.0 JNDI!</title>
</head>
<body>
Tomcat连接池测试,获取数据源 <br>
<%
try {
//初始化查找命名空间
Context ctx = new InitialContext();
//参数java:/comp/env为固定路径
Context envContext = (Context)ctx.lookup("java:/comp/env");
//参数jdbc/mysqlds为数据源和JNDI绑定的名字
DataSource ds = (DataSource)envContext.lookup("jdbc/mySqlite");
Connection conn = ds.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select count(1) from people;");
while (rs.next()) {
System.out.println("count = " + rs.getString(1));
}
conn.close();
out.println("<span style='color:red;'>JNDI测试成功<span>");
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%>
</body>
</html>
print:3
2、在项目的meta目录里配置,也可在tomcat的server.xml文件中配置,也要配置context文件,不做介绍。
在Web项目中的META-INF目录下新建一个文件context.xml,写入配置
这里也要写数据库的绝对路径,其他mysql、oracle写入端口库名即可。这样配置就不用配置tomcat/web.xml文件了
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/mySqlite"
auth="Container"
type="javax.sql.DataSource"
maxIdle="2"
maxWait="10000"
maxActive="4"
driverClassName="org.sqlite.JDBC"
url="jdbc:sqlite://F:/skx_space/java_web/sz_db/myfisrt.db"
logAbandoned="true" />
</Context>
1、
程序获取连接和关闭连接:
虽然有了连接池,并不代表可以任意使用,也是需要获取一个连接,使用完后归还给连接池,这里的close方法是连接池重写的方法,connection只是一个接口,其实连接池getConnection返回的是自定义的实现类,重写了connection中所有方法。 所以这里的close并不是断开TCP连接,而是将连接返回连接池。
而且这个close()是必须执行的,不然一直占用一个连接。