java/事务与连接池

https://blog.csdn.net/clover_lily/article/details/79985919

现在来看看MySQL数据库为我们提供的四种隔离级别:

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

web开发三层架构:
表现层web层:jsp、servlet、javBean(对象模型)
业务层service层:java类
持久化层dao:Java类封装的jdbc操作数据库

MVC是在表现层;

******SQL注入(sql条件中带 or之类的关键字):
解决方案:

不要使用statement,因为sql语句是拼接出来的,容易sql注入;
使用preparestatment,在sql中使用?占位,pst.setXXX(1,值1);1表示第一个问号;

******大二进制:
blob大二进制对象,可以存储可变数量的数据;TINYBLOB 、BLOB、 MEDIUMBLOB、  LONGBLOB
text(oracle中叫clob)大文本:分成四种:TINYTEXT(255字节)  TEXT(64K)  MEDIUMTEXT(16M) LONGTEXT(4G)
如果存到数据库的文件比较大,需要在my.ini文件中设置max_allowed_packet=64M或者更大。

存储大文本:FIle file=new File("d://xxxx")
FieReader fr=new FileReader(file);
pst.setCharactrStream(1,fr,(int)(file.length))

****批处理:一次执行多条sql语句,提高效率;
statement和preparedStatement都能提供批处理,
statement适合处理不同sql的批处理,preparedstatement适合处理相同的批处理,性能较高,
mysql的批处理中的preparedstatement预处理默认没有开启。mysql的预处理需要在url的后面加参数设置为true。注意驱动版本。

******事务:多个事情单元,要么全部成功,要么全部不成功。
1.mysql实现事务:
show variables like ‘%commit%’;可以查看当前autocommit的值;默认开启自动事务,只要sql语句执行就提交;
set automent=off;关闭自动事务;必须手动commit才提交,提交之前都是在内存中,没有改变数据表;

2.JDBC实现事务:

事务特点:原子性(不可分割,要么都不发生,要么全部发生)、一致性(前后数据一致,有增有减)、隔离性(事务与事务之间不影响)、持久性(数据一旦提交,就定下来了);

可能出现的问题:脏读,不可重复读,虚读和幻读。
事务的隔离级别,Serializable可避免脏读,不可重复读,虚读
Repeatable可避免脏读,不可重复读,不可以避免虚读
Read committed可避免脏读,(已提交的情况)
Read uncommited最低级别,上面情况都无法保证(没有提交的情况)。
怎样设置;set session transaction isolation level Serializable;如果设置成这种隔离级别,就会锁表,一个事务在对表进行操作时,其他事务就操作不了。这个性能不好。

JDBC设置隔离级别
事务操作需要connection;一般在业务层(service层)使用事务;
使用ThreadLocal来获取connection:把connection绑定到同一个线程,得到的同一个connection;

**丢失更新
多个事务对同一条记录操作,或提交的事务将先提交的事务覆盖。
锁必须爱事务中添加,事务结束了,锁就结束了。
解决丢失更新两种方法:悲观锁或者乐观锁;
悲观锁:假设数据丢失一定会发生,利用数据库内部机制管理事务;提供锁机制:共享锁select *from user lock in share mode;
排它锁(如果有排它锁,就不能加其他锁)select *from user for update;update语句默认添加排他锁;
乐观锁:假设丢失更新不会发生,采用程序中添加版本字段解决丢失更新的问题;updatetime字段类型是timestamp这个类型的字段自动更新时间戳(取系统的默认值);

******开源链接池:
对一个方法功能增强:1.继承;2.装饰模式;3.动态代理(可以吧别的方法拦截下来,执行自己的方法)
开源的连接池:1.dbcp DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的; 使用时要导入commons-jdcp和pool的jar包,

方法一:直接在properties中以aa=bb 的键值对形式设置;可以直接从配置文件中获取,用prop.load(fis流)直接获取properties文件,属性自动设置好;

private static DataSource dataSource; 
dataSource = BasicDataSourceFactory.createDataSource(properties); //读取properties文件中的配置创建链接池
connection = dataSource.getConnection();//获取链接池。

方法二:代码配置:

//建立连接的驱动驱动名称
    public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
    //数据库链接数据哭的url
    public static final String URL = "jdbc:mysql://localhost:3306/person";
    //链接的数据库账号
    public static final String USERNAME = "root";
    //链接的数据库密码
    public static final String PASSWORD = "root";
    //最大空闲链接
    private static final int MAX_IDLE = 3;
    //醉的等待时间
    private static final long MAX_WAIT = 5000;
    //最大活动链接
    private static final int MAX_ACTIVE = 5;
    //初始化时链接池的数量
    private static final int INITIAL_SIZE = 10;
    
    //的到链接实例
    private static BasicDataSource dataSource = new BasicDataSource();
    //初始化链接参数
    static{
        dataSource.setDriverClassName(DRIVER_CLASS_NAME);
        dataSource.setUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setMaxActive(MAX_IDLE);
        dataSource.setMaxWait(MAX_WAIT);
        dataSource.setMaxActive(MAX_ACTIVE);
        dataSource.setInitialSize(INITIAL_SIZE);
    }
    //提供获得数据源
    public static DataSource getDateSource(){
        return dataSource;
    }
    //提供获得链接
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();
    }

2.c3p0:Hibernate和spring也用他;

 

****tomcat内置连接池管理:使用的是apache的dbcp连接池;
只能在web里面使用;让服务器管理连接池。需要创建一个context.xml文件,在里面配置,context.xml的三个位置:
1.在tomcat/conf/中给全局用,只要在这个服务器上就可以;
2.在conf/Catalina/中给虚拟主机用;context.xml和locahost文件同级;
3.放在WEB-INF下面,连接池只给本项目用;

注意:如果是1和2的全局配置,需要把数据库驱动放到tomcet/lib目录下;

***从服务器获取连Context context=new InitialContext();
Context envCtx=(Context)context.lookup("java:comp/env");//固定路径
DataSource dataSource=(DataSource)envCtx.look("jdbc/EmployeedDB");//数据库
Connection con=datasource.getConnection();

猜你喜欢

转载自blog.csdn.net/u011146511/article/details/52216901