内容简介:所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如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 是怎样给事务又实现传播特性的?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
重新定义团队:谷歌如何工作
拉兹洛·博克 / 宋伟 / 中信出版集团 / 2015-12-1 / CNY 56.00
谷歌首席人才官拉斯洛•博克权威力作,谷歌公开认可的谷歌高层作品,首度揭秘谷歌颠覆工业时代模式的人才和团队管理的核心法则,《纽约时报》畅销榜第一名,Business Insider 2015最佳商业书籍,谷歌的创造力就在于此! 编辑推荐! 1、 谷歌人才官首次公开谷歌人才和团队管理的核心秘籍 在谷歌执掌人事多年的拉斯洛•博克是人才和团队管理的顶级专家。他加入谷歌后,谷歌的员工数从六......一起来看看 《重新定义团队:谷歌如何工作》 这本书的介绍吧!