内容简介:所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如sql的底层底层放到类中,当classloader加载的时候,直接完成初始化,如下:Class.forname("com.mysql.jdbc.Driver");在sql中是访问操作数据库的一个程序执行单元。具有原子性、一致性、永久性、隔离性。
- static 函数与属性。属于所有的对象共有的。在class加载的时候创建
- static {}:静态块,属于Class的,是classloader加载的时候调用
- {}非静态块,在构造函数调用之前调用
- 构造函数,创建对象的时候,进行初始化操作
- 普通的状态与函数,通过对象调用
所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如 sql 的底层底层放到类中,当classloader加载的时候,直接完成初始化,如下:
Class.forname("com.mysql.jdbc.Driver");
事务
在sql中是访问操作数据库的一个程序执行单元。具有原子性、一致性、永久性、隔离性。
事务的触发方式为在sql的终端:
- 启动事务 start transaction;
- commit;提交事务
- rollback;回退。
- rollback还是设置站定。
jbdc中的事务设置
默认到数据库的connnect是事务是自动进行的,没有条语句为一个事务。在jbdc中设置相应的设置方式: 1.启动 connect.setAutoTranscation(false); 2.connnect.commit();提交事务处理 3.connect.rollback();回退事务。
java一般处理方法如下:
Connection connect=....;
try{
.............
.........
connet.commmit();
}catch execpution e{
rollaback();
}finally{
connect.close();
}
复制代码
sql的事务并发问题
- 脏读,读取其他事务未提交的事务,未提交的事务可能会撤回。这个问题最为严重
- 不可重复读:在一个事务中,多次重复读得到数据不相同。原因有其他任务提交事务。
- 幻读 数据库的条目发生了变化。 事务隔离的等级:
- read uncommitted;读取没有提交事务,存在所有的并发问题,这种安全性最差,吞吐量最大
- read committed;读提交以后的事务,存在幻读与不可重复读的问题。安全性较好,吞吐量一般。oracle的默认
- repeatable read;多次读事务的值相同,如果有其他任务提交,读取数值不变,存在幻读的问题。安全性较好,吞吐量一般。mysql的默认
- serializable;串行操作事务,安全性最高能解决所有并发问题,吞吐量最小
总结事务的隔离等级中已经用了锁的概念。两个事务不能同时写入一个单元。所以在保证读写的情况下操作方式为:
可以防止任务干扰
read() write() read() write() 复制代码
更改事务的隔离等级----终端
通过设置tx_isolation变量。
- 查询 show variables like 'tx_isolation';或者select @@tx_isolation;
- 设置 set tx_isolation="read-committed';
事务等级-----jdbc
jbdc的设置方法。通过设置con. setTransactionIsolation(int level) 参数可选值如下:
- Connection.TRANSACTION_READ_UNCOMMITTED;
- Connection.TRANSACTION_READ_COMMITTED;
- Connection.TRANSACTION_REPEATABLE_READ;
- Connection.TRANSACTION_SERIALIZABLE。
读取:getTransaction();
连接池的概念
连接池就是资源池的概念,与线程池类似。创建好并进行管理,如有需要直接调用。 主要参数:
- 最大数量
- 初始化数量
- 最大空闲数量
- 单次创建增量
- 等待时间,当资源达到最大数量的时候,再申请资源进入等待状态,等待超时,抛出异常
javax包中提供了数据的连接池DataSource接口,但是标准没有具体的实现。
apache的实现
数据包为:commons-dbcp-1.4.jar 调用方式如下:
BasicDataSource dataSource1=new BasicDataSource();
dataSource1.setUrl(uri);
dataSource1.setUsername(username);
dataSource1.setPassword(password);
dataSource1.setDriverClassName(sqlDriver);
dataSource1.setMaxActive(30);
dataSource1.setMaxIdle(3);
dataSource1.setInitialSize(10);
dataSource1.setMaxWait(1000);
dataSource1.getConnection()
复制代码
c3p0的连接池的实现:
应用配位更为灵活,具有默认配置方式。一般我们采用这一种。对应的数据包为
- c3p0-0.9.2-pre1.jar
- mchange-commons-0.2.jar
- 配置文件名字为:c3p0-config.xml。放在src文件夹下
static public DataSource getC3P0DataSource() {
return new ComboPooledDataSource();
}
复制代码
或者如下,配置方式再增加
ComboPooledDataSource dataSource1=new ComboPooledDataSource();
dataSource1.setJdbcUrl(uri);
dataSource1.setUser(username);
dataSource1.setPassword(password);
dataSource1.setDriverClass(sqlDriver);
dataSource1.setMaxPoolSize(30);
dataSource1.setInitialPoolSize(10);
dataSource1.setAcquireIncrement(5);
dataSource1.setMinPoolSize(5);
return dataSource1;
复制代码
tomcat的servlet中增加资源:
需要在配置参数的Context的标签下增加资源。在server.xml中或者在localhost的文件下的文件中。注意tomcat部署的时候重新设置了配置文件。要在增加的配置文件中设置。
<Resource name="mydbcp"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
factory="org.apache.naming.factory.BeanFactory"
user="root"
password="123"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://127.0.0.1:3306/mydb1"
maxPoolSize="20"
minPoolSize ="5"
initialPoolSize="10"
/>
复制代码
调用方法
Context initContext=new InitialContext();
Context envContext=(Context)initContext.lookup("java:comp/env");
DataSource dataSource1=(DataSource) envContext.lookup("mydbcp");
复制代码
ThreadLocal对象
ThreadLocal这相当于与一个map<Thread,T>其中Thread对象为Thread.currentThread()。就是各个线程的数据互不干涉。3个函数: 1.set() 2.get() 3、remove()
dbUtils数据包:
commons-dbutils-1.4.jar这个数据包是方便读写连接池的包。 1.把所有的数据都当成object,通过与配置命令进行update。
QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
String sql="insert into emp2 values(?,?,?,?)";
Object [] objects={2,"zhangbin","man",2};
query1.update(sql, objects);
复制代码
处理过程如下:
int manipulateDB(Connection connect1,String string,Object ... paras){
try (
PreparedStatement state=connect1.prepareStatement(string)
){
setParas(state,paras);
return state.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private void setParas(PreparedStatement state, Object[] paras) throws SQLException {
for(int i=0 ;i < paras.length;i++){
state.setObject(i+1, paras[i]);
}
}
复制代码
2.读数据的时候,通过处理函数将result变量变为我们想要的对象。包提供了五中,我们也可以自己定义。
QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
String sql="select * from emp2 where id=?";
Object [] objects={2};
StuClass stu=query1.query(sql, new BeanHandler<StuClass>(StuClass.class),objects);
System.out.println(stu);
QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
String sql="select * from emp2 ";
// Object [] objects={2};
List<Map<String,Object>> map1=query1.query(sql, new MapListHandler());
System.out.println(map1);
复制代码
分解形式如下:
interface HandlerRS<T>{
public T handler(ResultSet rs) throws SQLException;
}
public <T>T queryDB(Connection connect1, String string, HandlerRS<T> hander, Object ... paras)
复制代码
- MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
- MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
- BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
- BeanListHandler:多行处理器!把结果集转换成List;
- ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
- ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
- Naming的空间包。在servlet的加载中采用了,以后可以注意一下用法。是 java 的包。
以上所述就是小编给大家介绍的《sql相关知识:池、事务、serverlet中资源调用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 被标记为事务的方法互相调用的坑(上)
- java – 在一个全局事务的范围内使用JTA同时向不同的数据源调用几个查询
- Java事务解析(事务的基本操作+隔离的等级+事务的四大特性+事务的概念)
- 在云中管理事务,第 1 部分: 事务基础和分布式事务
- Spring事务专题(三)事务的基本概念,Mysql事务处理原理
- 嵌套事务、挂起事务,Spring 是怎样给事务又实现传播特性的?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coding the Matrix
Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00
An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!