JDBC(三)数据库连接池(DBCP、C3P0)
前言
这段时间状态有一点浮躁,希望自己静下心来。还有特别多的东西还没有学懂。需要学习的东西非常的多,加油!
一、JDBC复习
Java Data Base Connectivity,java数据库连接,在需要存储一些数据,或者拿到一些数据的时候,就需要往数据库里存取数据。那么java如何连接数据库呢?需要哪些步骤?
1.1、注册驱动
1)什么是驱动
驱动就是JDBC实现类,通俗点讲,就是能够连接到数据库功能的东西就是驱动,由于市面上有很多数据库,Oracle、MySql等等,所以java就有一个连接数据库的实现规
范接口,定义一系列的连接数据库接口(java.sql.Driver接口),但是不提供实现,而每个数据库厂家来提供这些接口的具体实现,这样一来,不管使用的是什么数据库,我
们开发者写的代码都是相同的,就不必因为数据库的不同,而写法不同,唯一的不同就是数据库驱动不一样,使用mysql,那么就必须使用mysql的驱动,使用Oracle就必
须使用oracle的驱动实现类。
看下面mysql连接数据的原理图,看看驱动是在哪里,起什么作用?
2)DriverManager,一个工具类,是用于操作管理JDBC实现类的
原始写法:DriverManager.register(new Driver()); //因为使用的是MySql,所以在导包时就需要导入com.mysql.jdbc.Driver 现在写法:Class.forName("com.mysql.jdbc.Driver"); //不用导包,会执行com.mysql.jdbc.Driver类中的静态代码块,其静态代码块的内容为
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
分析:
会发现第二种加载驱动的方法的底层其实就是第一种加载驱动。为什么要这样呢?原因很简单, 第一种是硬编程,直接将数据库驱动给写死了,无法扩展,如果使用第一
种,那么连接的数据库只能是mysql,因为导包导的是mysql的驱动包,如果换成Oracle,就会报错,需要在代码中将Oracle的驱动包导入,这样很麻烦,而第二种写法就不
一样了,第二种是使用的字符串方法注册驱动的,我们只需要将该字符串提取到一个配置文件中,以后想换成oracle数据库,只需要将该字符串换成oracle驱动的类全名即可
,而不需要到代码中去修改什么东西。
1.2、获取连接
使用DriverManage来获得连接,因为DriverManager是驱动实现类的管理者
Connection conn = DriverManager.getConnection(url,user,password);
url:确定数据库服务器的位置,端口号,数据库名
jdbc:mysql://localhost:3306/db
user:登录名称,默认root
password:密码,默认root
这里只是说mysql,别的数据库,url格式就不同了。
MySQL jdbc:mysql://localhost:3306/db 默认端口是3306,粗体为连接时使用的数据库名
Oracle jdbc:oracle:thin:@localhost:1521:db 默认端口号1521
DB2 jdbc:db2://localhost:6789/db 默认端口号6789
SQLServer jdbc:microsoft:sqlserver://localhost:1433;databaseName=db 默认端口号1433
SQLServer 2005 jdbc:sqlserver://localhost:1433;databaseName=db 默认端口号1433
1.3、获取执行sql对象,PreparedStatement对象
通过Connection对象获取Statement或者PraparedStament对象(使用它)处理sql
1)Statement
Statement st = conn.createStatement(); //获取sql语句执行对象
st.excuteUpdate(sql); //执行增删改语句
st.excuteQuery(sql); //执行查询语句
sql语句必须是完整的。
2)PraparedStatment
sql语句可以不是完整的,可以将参数用?替代,然后在预编译后加入未知参数
PraparedStatment ps = conn.prapareStatement(sql); //获取sql语句执行对象praparedStatment
赋值
ps.setInt(Index,value); ps.setString(index,value); //可以设置很多中类型,index从1开始,代表sql语句中的第几个未知参数,
ps.excuteUpdate(); //执行增删改语句
ps.excuteQuery(sql); //执行查询语句
这两个的区别,常使用的是PraparedStatment对象,因为它可以预编译,效率高,可以设置参数等等优点。
1.4、获取结果集对象
int count = ps.excuteUpdate(); //执行增删改的sql语句时,返回一个int类型的整数,代表数据库表影响的行数,
Result result = ps.excuteQuery(); //执行查询sql语句时,返回一个结果集对象,该对象装着所有查询到的数据信息,一行一行的存储数据库表信息。
1.5、处理结果集
对查询到的Result结果进行处理,拿到所有数据,并封装成对象。
while(rs.next()){ 获取行数据的第一种方式
rs.getString(index);//index代表第几列,从1开始 获取行数据的第二中方式
rs.getString(string); //string:代表字段名称。 }
总结:java的JDBC就分为5步,4个属性
属性:driver、url、user、password
五步:
注册驱动、获取连接、获取执行sql语句对象、获取结果集对象、处理结果。
二、JDBC的CURD操作
创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作
查询所有(读取Retrieve)
2.1、查询所有记录读取(Retrieve)
@Test
public void findAll() throws Exception{
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//3语句执行者,sql语句
Statement st = conn.praparedStatement("select * from t_user");
//4 执行查询语句
ResultSet rs = st.executeQuery();
//5处理数据
// * 如果查询多个使用,使用while循环进行所有数据获取
// * 技巧:如果查询结果最多1条,使用 if(rs.next()) { 查询到了 } else { 没有数据 }
while(rs.next()){
int id = rs.getInt();
String username = rs.getString();
String password =rs.getString();
System.out.print(id + ", ");
System.out.print(username + ", ");
System.out.println(password);
}
//6释放资源
rs.close();
st.close();
conn.close(); }
findAll()
2.2、增加操作(创建Create)
@Test
public void save() throws Exception{
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//3语句执行者
Statement st = conn.praparedStatement("insert into t_user(username,password) values(?,?)");
//3.1赋值
st.setString(,"xiaoming");
st.setString(,"");
//4 执行DML语句
int r = st.executeUpdate(); //5处理数据
System.out.println(r); //6释放资源
//rs.close();
st.close();
conn.close();
}
save()
2.3、更新操作 (Update)
@Test
public void update() throws Exception{
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//3语句执行者
Statement st = conn.praparedStatement("update t_user set username = ? where id = ? ");
//3.1赋值参数
st.setString(,"xiaoye");
st.setInt(,);
//4 执行DML语句
int r = st.executeUpdate(); //5处理数据
System.out.println(r); //6释放资源
//rs.close();
st.close();
conn.close();
}
update()
2.4、删除操作(delete)
@Test
public void delete() throws Exception{
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获得连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//3语句执行者
Statement st = conn.praparedStatement("delete from t_user where id = ?");
//3.1赋值参数
st.setInt(,);
//4 执行DML语句
int r = st.executeUpdate(); //5处理数据
System.out.println(r); //6释放资源
//rs.close();
st.close();
conn.close();
}
delete()
也可以用我前面写的JDBC连接的工具类去连接!
三、数据库连接池
在上面,我们在进行CRUD时,一直重复性的写一些代码,比如最开始的注册驱动,获取连接代码,一直重复写,通过编写一个获取连接的工具类后,解决了这个问题,但是又
会出现新的问题,每进行一次操作,就会获取一个连接,用完之后,就销毁,就这样一直新建连接,销毁连接,新建,销毁,连接Connection 创建与销毁 比较耗时的。所以应
该要想办法解决这个问题?
解决方法:
连接池就是为了解决这个问题而出现的一个方法,为了提高性能,开发连接池,连接池中一直保持有n个连接,供调用者使用,调用者用完返还给连接池,继续给别的调用
者使用,比如连接池中一开始就有10个连接,当有5个用户拿走了5个连接后,池中还剩5个,当第6个用户在去池中拿连接而前面5个连接还没归还时,连接池就会新建一个
连接给第六个用户,让池中一直能够保存最少5个连接,而当这样新建了很多连接后,用户归还连接回来时,会比原先连接池中的10个连接更多,连接池就会设置一个池中
最大空闲的连接数,如果超过了这个数,就会将超过的连接给释放掉,连接池就是这样工作的。
3.1、连接池概述
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避
免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
3.2、比较应用程序直接获取连接和使用连接池
1)应用程序直接获取连接
缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。
假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。
2)使用连接池连接
目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。
四、常用的数据库连接池
现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,
数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池
C3P0 数据库连接池
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。
DBCP、C3P0、tomcat内置连接池(JNDI)是我们开发中会用到的。
4.1、DBCP连接池
1)概述
DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
1)获取连接的两种方式
两种方式获得连接,使用配置文件,不使用配置文件
1.1)不使用配置文件,自己手动设置参数
第一:导包
第二:测试例子
package com.zyh.util; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; public class TestDBCP { public static void main(String[] args) {
Connection conn = TestDBCP.getConnection();
try {
String sql = "select id,name,price from book";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String id = rs.getString();
String name = rs.getString();
double price = rs.getDouble();
System.out.println("id="+id+",name="+name+",price="+price);
System.out.println("-------------------------");
} } catch (SQLException e) {
e.printStackTrace();
} } public static Connection getConnection(){
//创建核心类
BasicDataSource bds = new BasicDataSource();
//配置4个基本参数
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql:///book");
bds.setUsername("root");
bds.setPassword(""); //管理连接配置
bds.setMaxActive(); //最大活动数
bds.setMaxIdle(); //最大空闲数
bds.setMinIdle(); //最小空闲数
bds.setInitialSize(); //初始化个数 //获取连接
try {
Connection conn = bds.getConnection();
return conn;
} catch (SQLException e) {
throw new RuntimeException(e);
}
} }
TestDBCP
1.2)使用配置文件,参数写入配置文件中即可,也就是通过配置文件来配置驱动、用户名、密码、等信息
第一:导包
和上面的一样的
第二:导入配置文件dbcpconfig.properties
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/book
username=root
password= #<!-- 初始化连接 -->
initialSize= #最大连接数量
maxActive= #<!-- 最大空闲连接 -->
maxIdle= #<!-- 最小空闲连接 -->
minIdle= #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait= #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk #指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
dbcpconfig.properties
第三:获取连接,测试例子
package com.zyh.util; import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class TestDBCPPro { public static void main(String[] args) {
Connection conn = TestDBCPPro.getConnection();
try {
String sql = "select id,name,price from book";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String id = rs.getString();
String name = rs.getString();
double price = rs.getDouble();
System.out.println("id="+id+",name="+name+",price="+price);
System.out.println("-------------------------");
} } catch (SQLException e) {
e.printStackTrace();
}
} public static Connection getConnection(){
//通过类加载器获取指定配置文件的输入流,TestDBCPPro是一个类名
InputStream in = TestDBCPPro.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties properties = new Properties();
try {
properties.load(in);
//加载配置文件,获得配置信息
DataSource ds = BasicDataSourceFactory.createDataSource(properties);
Connection conn = ds.getConnection();
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }
TestDBCPPro
1.3)编写一个数据源工具类
package com.zyh.util; import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.imageio.stream.FileImageInputStream;
import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPUtils {
private static DataSource ds = null;
static{
Properties prop = new Properties();
try {
prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//根据DBCPUtil的classes的路径,加载配置文件
ds = BasicDataSourceFactory.createDataSource(prop);//得到一个数据源
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化错误,请检查配置文件");
}
} public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException("服务器忙。。。");
}
} public static void release(Connection conn,Statement stmt,ResultSet rs){
//关闭资源
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();//关闭
} catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
} }
DBCPUtils
4.2、C3P0
1)导包
2)从配置信息中获取 配置文件必须为xml(c3p0-config.xml)
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/book</property>
<property name="user">root</property>
<property name="password"></property> <property name="checkoutTimeout"></property>
<property name="idleConnectionTestPeriod"></property>
<property name="initialPoolSize"></property>
<property name="maxIdleTime"></property>
<property name="maxPoolSize"></property>
<property name="minPoolSize"></property>
<property name="maxStatements"></property>
<user-overrides user="test-user">
<property name="maxPoolSize"></property>
<property name="minPoolSize"></property>
<property name="maxStatements"></property>
</user-overrides>
</default-config>
<!-- 命名的配置 -->
<named-config name="jxpx">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/myums</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement"></property>
<property name="initialPoolSize"></property>
<property name="minPoolSize"></property>
<property name="maxPoolSize"></property>
<property name="maxStatements"></property>
<property name="maxStatementsPerConnection"></property>
</named-config>
</c3p0-config>
c3p0-config.xml
从配置文件中看,需要注意一个地方,一个是default-config,一个是name-config,两者都区别在于创建核心类对象时,如果将name-config作为参数传进去,
那么将会调用name-config下的配置信息,否则将调用default-config下的配置信息,
两种方式使用c3p0,加参数,使用named-config 的配置信息,不加参数,自动加载配置信息,加载的是default-config中的信息。
//1 c3p0...jar 将自动加载配置文件。规定:WEB-INF/classes (src) c3p0-config.xml,也就是将配置文件放在src下就会自动加载。
//ComboPooledDataSource dataSource = new ComboPooledDataSource(); //自动从配置文件 <default-config>
ComboPooledDataSource dataSource = new ComboPooledDataSource(); //手动指定配置文件 <named-config name="jxpx">
Connection conn = dataSource.getConnection();
System.out.println(conn);
3)编写一个数据源工具类
这个工具类的xml是:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/book/property>
<property name="user">root</property>
<property name="password"></property>
<property name="initialPoolSize"></property>
<property name="maxIdleTime"></property>
<property name="maxPoolSize"></property>
<property name="minPoolSize"></property> </default-config> </c3p0-config>
c3p0-config.xml
工具类
package com.zyh.util; import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Util {
//得到一个数据源
private static DataSource dataSource = new ComboPooledDataSource(); //从数据源中得到一个连接对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("服务器错误");
}
} public static void release(Connection conn,Statement stmt,ResultSet rs){
//关闭资源
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();//关闭
} catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
} }
C3P0Util
4.3、用JavaWeb服务器管理数据源:Tomcat
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源。
Tomcat:(DBCP)
数据源只需要配置服务器即可。
配置数据源的步骤:
1)拷贝数据库连接的jar到tomcatlib目录下
2)配置数据源XML文件
a)如果把配置信息写在tomcat下的conf目录的context.xml中,那么所有应用都能使用此数据源。
b)如果是在当前应用的META-INF中创建context.xml, 编写数据源,那么只有当前应用可以使用。
<Context>
<Resource name="jdbc/datasource" auth="Container"
type="javax.sql.DataSource" username="root" password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/book"
maxActive="" maxIdle=""/>
</Context>
context.xml
在servlet中进行测试:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env"); //path
dataSource = (DataSource)envCtx.lookup("jdbc/datasource"); //context.xml中resource的name
注意:此种配置下,驱动jar文件需放置在tomcat的lib下
扩展:
JNDI技术介绍:
1)JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包。
2)这套API的主要作用在于:
它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
3)其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
JDBC(三)数据库连接池(DBCP、C3P0)的更多相关文章
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- java之数据库连接池-dbcp&c3p0&dbutils
介绍 因为数据库连接对象的创建比较消耗性能,所以可以在应用程序启动时就在内存中开辟一片空间(集合)存放多个数据库连接对象,后面需要连接时直接从该空间中取而不用新创建:使用完毕后归还连接(将连接重新放回 ...
- java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)
复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用: 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明(转)
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
随机推荐
- 03标准对象-02-RegExp 正则表达式
1.基本概念 和 定义 用一种描述性的语言来给字符串定义一个规则,你可以形象地理解正则表达式是一个"框",凡是符合大小形状条件的字符串,都算是"匹配"了. JS ...
- New Features and changes of Ninject 3.3
Ninject 3.3 beta1 has gone live. This release mainly focus on bug fix and platform update. Support . ...
- js函数基础知识
[函数的声明及调用] function 函数名(参数1,参数2,....){ //函数体代码 return返回值: } 1.函数的调用: ①直接调用:函数名(参数1的值,参数2的值,....) ②事件 ...
- SQLServer 自动循环归档分区数据脚本
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/表分区 概述 在很多业务场景下我们需要对一些记录量比较大的表进行分区,同时为了保证性能需要将一些旧的数据进行归档.在分区表很多的情 ...
- windows 结束进程的详细过程
windows上如何结束进程的详细过程,下面附详细,图文说明 在cmd下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程 在cmd下, ...
- 封装好的图片滑动框架(AndroidImageSlider)
前言 广告轮播条的重要性不言而喻.在很多类型app中出场率都很高. 今天给大家介绍一个轮播图开源项目,这个项目把轮播图需要的ViewPager跟计时器做了封装,使用极其方便,支持gradle在线依赖. ...
- 进入css3动画世界(二)
进入css3动画世界(二) 今天主要来讲transition和transform入门,以后会用这两种属性配合做一些动效. 注:本文面向前端css3动画入门人员,我对这个也了解不深,如本文写的有纰漏请指 ...
- Linux入门之常用命令(11)复制cp及scp
[scp] ================== scp 命令 ================== scp 可以在 2个 linux 主机间复制文件: 命令基本格式: scp [可选参 ...
- SpringMVC学习笔记(二)
一.导航 复杂类型的参数绑定 校验 异常处理 图片上传 json交互 拦截器 二.复杂类型参数绑定 ①.包装类型的pojo参数绑定 使用场景:实现商品查询条件传入. 实现方法:>通过添加Http ...
- D. Mysterious Present (看到的一个神奇的DP,也可以说是dfs)
D. Mysterious Present time limit per test 2 seconds memory limit per test 64 megabytes input standar ...