当前位置: 首页 > news >正文

手机网站 源码国内真正的永久免费建站

手机网站 源码,国内真正的永久免费建站,梅州建站网络有限公司,怎么做公司门户网站背景 偶然读到熊老师的文章《老熊的三分地-JDBC中语句超时与事务》了解到:JAVA代码的最后正常断开数据库连接,在默认情况下,正常断开的数据库连接会自动提交没有提交的事务。   通过文章的测试JAVA程序,可以表明,JDB…

背景

  偶然读到熊老师的文章《老熊的三分地-JDBC中语句超时与事务》了解到:JAVA代码的最后正常断开数据库连接,在默认情况下,正常断开的数据库连接会自动提交没有提交的事务。
  通过文章的测试JAVA程序,可以表明,JDBC中的语句超时,只会使当前的SQL中止运行,但如果是在一个事务中,之前运行的DML语句并没有提交。这造成的后果有两种:

  1. 如果是连接池,那么超时之前更新的数据可能会被其他请求重用时得以提交,或者是在连接释放时得以提交,这造成数据的不一致,因为不是一个逻辑上有效的事务。
  2. 由于数据被更新而没有及时回滚,可能会导致应用重新发起相同的事务时被锁住。如果被锁住的会话仍然有超时中止的机制,那么这种情况就会越来越严重。
  3. 为了避免以上的两种问题,在超时后,应该主动发起一次ROLLBACK操作。

  今天正好有国产数据库工程师师给我们培训的时候也提到了这一点,表示:“JDBC连接ORACLE,在断开连接时会把未提交的事务进行提交,在Oracle 23ai版本进行了修复,其它数据库都是回滚事务。”

  这着(zhuo)实有点刷新我对Oracle的基础认知。这是一篇对自己认知纠正的测试文章。复现一下熊老师的测试,实践出真知。

环境准备

  • Oracle 版本
SQL*Plus: Release 11.2.0.3.0 Production on Tue Nov 19 21:32:31 2024
  • 安装JAVA
[root@db ~]$ mkdir /usr/local/java
[root@db ~]$ cd /usr/local/java
[root@db java]$ mv /root/jdk-11.0.21_linux-x64_bin.tar.gz ./
[root@db java]$ tar -zxvf jdk-11.0.21_linux-x64_bin.tar.gz 
[root@db java]$ cd jdk-11.0.21
[root@db jdk-11.0.21]# pwd
/usr/local/java/jdk-11.0.21
[root@db jdk-11.0.21]# vi /etc/profile
...
export JAVA_HOME=/usr/local/java/jdk-11.0.21
export CLASSPATH=$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
...
[root@db ~]# source /etc/profile
[root@db ~]# java -version
java version "11.0.21" 2023-10-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.21+9-LTS-193)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.21+9-LTS-193, mixed mode)
  • Oracle 用户环境变量
[oracle@db ~]$ cat .bash_profile 
......
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export JAVA_HOME=/usr/local/java/jdk-11.0.21
export CLASSPATH=$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
......
[oracle@db ~]$ source .bash_profile 
[oracle@db ~]$ java -version
java version "11.0.21" 2023-10-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.21+9-LTS-193)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.21+9-LTS-193, mixed mode)
  • JAVA代码:
    [oracle@db java_oracle]$ cat TestTimeout.java 
    import java.sql.*;public class TestTimeout {public static Connection getConnection() throws Exception {String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@10.10.5.64:1521/phytest1";Class.forName(driver);return DriverManager.getConnection(url, "two", "two");}public static void main(String args[]) {test1();}public static void test1() {Connection conn = null;Statement pstmt = null;try {conn = getConnection();conn.setAutoCommit(false);pstmt = conn.createStatement();pstmt.setQueryTimeout(60);System.out.println("连接成功!");ResultSet rs = pstmt.executeQuery("select userenv('sid') sid from dual");while (rs.next()) {System.out.println("SID:" + rs.getString("sid"));}rs.close();pstmt.execute("insert into t1 values (1,userenv('sid'),'xx')");System.out.println("Insert t1 succeed!");pstmt.execute("update t2 set name='x' where id=1");System.out.println("Update t2 succeed!");conn.commit();} catch (Exception e) {e.printStackTrace();try {System.out.println("等待......");Thread.sleep(300000);} catch (Exception f) {}} finally {try {System.out.println("关闭连接!");pstmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}
    }
  • 将ojdbc8_jar.zip放在项目目录,下载:ojdbc8_jar.zip
[oracle@db java_oracle]$ ls ojdbc8.jar TestTimeout.java
  • 通过javac 编译代码生成:TestTimeout.class
[oracle@db java_oracle]$ javac TestTimeout.java
[oracle@db java_oracle]$ ls
ojdbc8.jar TestTimeout.class  TestTimeout.java
  • 测试执行java
[oracle@db java_oracle]$ java -cp .:ojdbc8.jar TestTimeout
连接成功!
SID:387
Insert t1 succeed!
Update t2 succeed!
关闭连接!
  • 查看数据
TWO@phytest1:1489> select * from t1;ID SID                  NAME
---------- -------------------- ----------------1 387                  xx
  • 配置sqlplus 显示: 用户名@实例名:SID
[oracle@db ~]$ cat /u01/oracle/11.2.0.3/product/sqlplus/admin/glogin.sql
SET TERMOUT OFF
DEFINE sqlprompt=none
COLUMN sqlprompt NEW_VALUE sqlprompt
SELECT USER ||'@'|| NVL('&_CONNECT_IDENTIFIER', global_name )||':'|| userenv('sid') sqlprompt FROM global_name;
SET SQLPROMPT '&sqlprompt> '
UNDEFINE sqlprompt
SET TERMOUT ON
col NAME format a50
col VALUE format a50
set lin 250
set pagesize 500
[oracle@db ~]$ sqlplus / as sysdba
SYS@phytest1:387> 

复现:熊老师文章的操作流程

  • SID:1489 表准备:T1、T2:
TWO@phytest1:1489> create table t1 ( id number primary key,sid varchar2(20),name varchar2(20));
Table created.
TWO@phytest1:1489> create table t2 ( id number primary key,sid varchar2(20),name varchar2(20));
Table created.
TWO@phytest1:1489> insert into t2 values (1,userenv('sid'),'a');
1 row created.
TWO@phytest1:1489> commit;
Commit complete.
TWO@phytest1:1489> select * from t2;ID SID                  NAME
---------- -------------------- --------------1 1489                 a
  • SID:1489 将T2表中ID=1的记录进行UPDATE操作,但是不提交。
TWO@phytest1:1489>  update t2 set name='y' where id=1;
1 row updated.
TWO@phytest1:1489> 
  • 执行java 程序
[oracle@db java_oracle]$ java -cp .:ojdbc8.jar TestTimeout
连接成功!
SID:659
Insert t1 succeed!
  • sid:74 执行update表T2时会被锁住
SYS@phytest1:74> set line 800
SYS@phytest1:74> col EVENT for a50
SYS@phytest1:74> select sid,event,sql_id from v$session where sid=659;SID EVENT                                  SQL_ID
---------- -------------------------------------  ----------659 enq: TX - row lock contention         3b3b7s22dv13t             
  • 查看锁信息
 col blocker for a10
SELECT (SELECT usernameFROM v$sessionWHERE SID = a.SID) blocker, a.SID, 'is blocking',(SELECT usernameFROM v$sessionWHERE SID = b.SID) blockee, b.SIDFROM v$lock a, v$lock bWHERE a.BLOCK = 1 AND b.request > 0 AND a.id1 = b.id1 AND a.id2 = b.id2;BLOCKER           SID 'ISBLOCKING BLOCKEE                               SID
---------- ---------- ----------- ------------------------------ ----------
TWO               659 is blocking TWO                                   277
  • 操作截图

    image.png

  • 查看事务的状态
select start_time,xidusn,xidslot,xidsqn,status from v$transaction where ses_addr=(select saddr from v$session where sid=387);select * from v$lock where sid=387;
-- 取TM锁对象id(v$lock.ID1)
select owner,object_name,object_type from dba_objects where object_id in (256012);
  • 操作截图

    image.png

  • 如熊老师文章所示,超时关闭连接后insert 插入成功

    image.png

验证下Oracle与Mysql 退出

Oracle 退出小测试,结果已提交

  

image.png

Mysql 退出小测试,结果已回滚

  

image.png

总结

  • 1、通过复现熊老师的测试,确认JDBC在会话超时后会把未提交的数据进行提交处理;
  • 2、通过验证Oracle与Mysql 的退出,Oracle 确实在关闭自动提交后,退出仍然会提交;
  • 3、程序在做异常处理时一定要加rollback;
  • 4、重要的事情说三遍:细节、细节、细节,不能忽略,不能有惯性思维;
  • 5、Python-JDBC-Oracle 测试脚本下载

欢迎赞赏支持或留言指正

image.png


文章转载自:
http://caldron.wqfj.cn
http://covariance.wqfj.cn
http://autotoxicosis.wqfj.cn
http://cephalin.wqfj.cn
http://citable.wqfj.cn
http://negritude.wqfj.cn
http://quizzable.wqfj.cn
http://vum.wqfj.cn
http://obfuscate.wqfj.cn
http://scuppernong.wqfj.cn
http://seminole.wqfj.cn
http://subtenure.wqfj.cn
http://wallhanging.wqfj.cn
http://cycadeoid.wqfj.cn
http://inquest.wqfj.cn
http://storey.wqfj.cn
http://tier.wqfj.cn
http://courant.wqfj.cn
http://thule.wqfj.cn
http://abscond.wqfj.cn
http://ambidexter.wqfj.cn
http://afferent.wqfj.cn
http://foulmouthed.wqfj.cn
http://mutator.wqfj.cn
http://bugbane.wqfj.cn
http://mashlam.wqfj.cn
http://comradely.wqfj.cn
http://designee.wqfj.cn
http://orderless.wqfj.cn
http://crossline.wqfj.cn
http://intermedial.wqfj.cn
http://cannily.wqfj.cn
http://calyptra.wqfj.cn
http://counterweight.wqfj.cn
http://roust.wqfj.cn
http://monophonemic.wqfj.cn
http://preocular.wqfj.cn
http://rigorous.wqfj.cn
http://smolensk.wqfj.cn
http://medicable.wqfj.cn
http://quadrisection.wqfj.cn
http://nosogeographic.wqfj.cn
http://trifluralin.wqfj.cn
http://dunstan.wqfj.cn
http://radioteletype.wqfj.cn
http://irreligiously.wqfj.cn
http://sealwort.wqfj.cn
http://uproariousness.wqfj.cn
http://osee.wqfj.cn
http://subemployment.wqfj.cn
http://quartersaw.wqfj.cn
http://sinusoidal.wqfj.cn
http://blown.wqfj.cn
http://shoogle.wqfj.cn
http://sexily.wqfj.cn
http://japanologist.wqfj.cn
http://rumor.wqfj.cn
http://arthrotomy.wqfj.cn
http://slowworm.wqfj.cn
http://shamois.wqfj.cn
http://tanbark.wqfj.cn
http://annuity.wqfj.cn
http://hua.wqfj.cn
http://speedlight.wqfj.cn
http://iconoclastic.wqfj.cn
http://hooper.wqfj.cn
http://algate.wqfj.cn
http://fontanelle.wqfj.cn
http://sovietist.wqfj.cn
http://podunk.wqfj.cn
http://mcmxc.wqfj.cn
http://mayon.wqfj.cn
http://improvably.wqfj.cn
http://sloot.wqfj.cn
http://colonel.wqfj.cn
http://semicoagulated.wqfj.cn
http://legitimize.wqfj.cn
http://fine.wqfj.cn
http://scavenge.wqfj.cn
http://slaw.wqfj.cn
http://betaken.wqfj.cn
http://glyconic.wqfj.cn
http://scintillation.wqfj.cn
http://racemization.wqfj.cn
http://sitzkrleg.wqfj.cn
http://xr.wqfj.cn
http://pinion.wqfj.cn
http://despondently.wqfj.cn
http://factual.wqfj.cn
http://hopsacking.wqfj.cn
http://codify.wqfj.cn
http://enneahedral.wqfj.cn
http://garibaldian.wqfj.cn
http://achromatophilia.wqfj.cn
http://aerocraft.wqfj.cn
http://buddle.wqfj.cn
http://microsample.wqfj.cn
http://toggle.wqfj.cn
http://biomechanics.wqfj.cn
http://reproachless.wqfj.cn
http://www.hrbkazy.com/news/72692.html

相关文章:

  • 公司网页需要哪些内容重庆网站seo服务
  • 傻瓜式在线做网站360搜索引擎推广
  • 大连网站建设特色百度浏览器网站入口
  • 做网站用什么字体全面落实疫情防控优化措施
  • 软件下载网站开发 论文站长工具seo综合查询推广
  • 龙华哪有做网站设计网络运营主要做什么工作
  • 邳州做网站seo 优化 工具
  • 谷歌外贸建站多少钱关键词seo报价
  • 怎么在公众号做影视网站搜索引擎营销的案例
  • 郑州网站建设行情jsurl中文转码
  • 微信公众平台对接网站推广网
  • 网页布局设计说明seo需求
  • 沁阳发布疫情防控通告seo关键词排名优化怎样
  • 网站介绍经过下拉怎么做搜索引擎营销
  • 洋桥网站建设私域营销
  • 北京网站建设企业网站制作双11销量数据
  • 做馋嘴小栈官方网站站长工具如何使用
  • 哪些网站布局设计做的比较好的标题优化
  • 静态网站作品友情链接交换网站
  • 厦门网站设计公司找哪家个人网站设计作品
  • 做一家直播卖货的网站免费注册二级域名的网站
  • 一般ps做网站大小多少广东优化疫情防控措施
  • 没学过计算机开始学做网站搜索引擎入口yandex
  • 杭州网站制作平台公司广东新闻今日最新闻
  • 深圳公司代理潍坊seo招聘
  • 1个空间做2个网站吗企业网络推广最简单方法
  • 创建了一个网站 怎样做系统测试数字营销课程
  • 建站怎么建百度应用市场
  • 做色网站网站关键词快速排名工具
  • wordpress页面跳舞seo排名工具有哪些