JDBC的DataSource是什么,有什么好处
JDBC的DataSource是什么,有什么好处
DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:
- 缓存PreparedStatement以便更快的执行
- 可以设置连接超时时间
- 提供日志记录的功能
- ResultSet大小的最大阈值设置
- 通过JNDI的支持,可以为servlet容器提供连接池的功能
如何通过JDBC的DataSource和Apache Tomcat的JNDI来创建连接池?
如何通过JDBC的DataSource和Apache Tomcat的JNDI来创建连接池?
Tomcat服务器也给我们提供了连接池,内部其实就是DBCP
步骤:
- 在META-INF目录下配置context.xml文件【文件内容可以在tomcat默认页面的 JNDI Resources下Configure Tomcat's Resource Factory找到】
- 导入Mysql或oracle开发包到tomcat的lib目录下
- 初始化JNDI->获取JNDI容器->检索以XXX为名字在JNDI容器存放的连接池
context.xml文件的配置:
<Context>
<Resourcename="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/zhongfucheng"
maxActive="8"
maxIdle="4"/>
</Context>
try{
//初始化JNDI容器
ContextinitCtx=newInitialContext();
//获取到JNDI容器
ContextenvCtx=(Context)initCtx.lookup("java:comp/env");
//扫描以jdbc/EmployeeDB名字绑定在JNDI容器下的连接池
DataSourceds=(DataSource)
envCtx.lookup("jdbc/EmployeeDB");
Connectionconn=ds.getConnection();
System.out.println(conn);
}
Apache的DBCP是什么?
Apache的DBCP是什么
如果用DataSource来获取连接的话,通常获取连接的代码和驱动特定的DataSource是紧耦合的。另外,除了选择DataSource的实现类,剩下的代码基本都是一样的。
Apache的DBCP就是用来解决这些问题的,它提供的DataSource实现成为了应用程序和不同JDBC驱动间的一个抽象层。Apache的DBCP库依赖commons-pool库,所以要确保它们都在部署路径下。
使用DBCP数据源的步骤:
- 导入两个jar包【Commons-dbcp.jar和Commons-pool.jar】
- 读取配置文件
- 获取BasicDataSourceFactory对象
- 创建DataSource对象
privatestaticDataSourcedataSource=null;
static{
try{
//读取配置文件
InputStreaminputStream=Demo3.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Propertiesproperties=newProperties();
properties.load(inputStream);
//获取工厂对象
BasicDataSourceFactorybasicDataSourceFactory=newBasicDataSourceFactory();
dataSource=basicDataSourceFactory.createDataSource(properties);
}catch(IOExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticConnectiongetConnection()throwsSQLException{
returndataSource.getConnection();
}
//这里释放资源不是把数据库的物理连接释放了,是把连接归还给连接池【连接池的Connection内部自己做好了】
publicstaticvoidrelease(Connectionconn,Statementst,ResultSetrs){
if(rs!=null){
try{
rs.close();
}catch(Exceptione){
e.printStackTrace();
}
rs=null;
}
if(st!=null){
try{
st.close();
}catch(Exceptione){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}