`
buerkai
  • 浏览: 168680 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JDBC

阅读更多
当处理多个访问相同数据的用户时,通常可能出现三种问题:

脏读。当应用程序使用了被另一个应用程序修改过的数据,而这个数据处于未提交状态时,就会发生脏读。第二个应用程序随后会请求回滚被其修改的数据。第一个事务使用的数据就会被损坏,或者“变脏”。
单读。当一个事务获得了数据,而该数据随后被一个单独的事务所更改时,若第一个事务再次读取更改后的数据,就会发生单读。这样,第一个事务进行了一个单读。
虚读。当事务通过某种查询获取了数据,另一个事务修改了部分该数据,原来的事务第二次获取该数据时,就会发生虚读。第一个事务现在会有不同的结果集,它可能包含虚读。
事务的级别
为了解决与“多个线程请求相同数据”相关的问题,事务之间用锁相互隔开。多数主流的数据库支持不同类型的锁;因此,JDBC API 支持不同类型的事务,它们由 Connection 对象指派或确定。在 JDBC API 中可以获得下列事务级别:

TRANSACTION_NONE 说明不支持事务。
TRANSACTION_READ_UNCOMMITTED 说明在提交前一个事务可以看到另一个事务的变化。这样脏读、单读和虚读都是允许的。
TRANSACTION_READ_COMMITTED 说明读取未提交的数据是不允许的。这个级别仍然允许单读和虚读产生。
TRANSACTION_REPEATABLE_READ 说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
TRANSACTION_SERIALIZABLE 是最高的事务级别,它防止脏读、单读和虚读。

假定您的数据库和 JDBC 驱动程序支持这个特性,则给定一个 Connection 对象,您可以明确地设置想要的事务级别:

conn.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;

您还可以确定当前事务的级别:

if(conn.getTransactionLevel() == TRANSACTION_SERIALIZABLE) {
System.out.println("Highest Transaction Level in operation.") ;
}
事务和批处理

缺省情况下,JDBC 驱动程序运行在被称为自动提交(AutoCommit)的模式下。在这个模式下,发送到数据库的所有命令运行在它们自己的事务中。虽然这用起来很方便,但它带来了性能损失,因为事务需要一定数量的开销来作适当地设置。如果您想能够明确地控制提交和回滚,就需要用下面的语句禁用自动提交模式(我们仍然认为你声明的Connection对象为conn):

conn.setAutoCommit(false);

你也可以确认当前是否是自动提交模式:

if(conn.getAutoCommit() == true){
System.out.println("Auto Commit Mode");
}else{
System.out.println("Not Auto Commit Mode");
}

很多数据库支持批处理操作,在批处理操作中通过在一次单独的操作(或批处理)中执行多个数据库更新操作,开销可被最小化。批处理操作在 JDBC 2.0 中被引入,它要求事务不处于自动提交模式。我们还是来看代码:

conn.setAutoCommit(false) ;
Statement stmt = conn.createStatement() ;
stmt.addBatch("INSERT INTO people S('jerrykey', 123, 123, 123)") ;
stmt.addBatch("INSERT INTO people S('Kaede', 123, 123, 123)") ;
stmt.addBatch("INSERT INTO people S('kissjava', 123, 123, 123)") ;
int[] updateCounts = stmt.executeBatch() ;
con.commit() ;

注意,executeBatch() 方法返回一个更新计数的数组,每个值对应于批处理操作的一个命令。关于批处理操作的最后一个问题是,它们可能抛出一个类型为 BatchUpdateException 的新的异常,这个异常说明批处理操作中至少有一条命令失败了。这样,您就需要在try...catch...块中包含他们。

使用存储点进行严密的事务控制

从 JDBC 3.0 API 开始,增加了一个与事务相关的新的接口元素。这个接口引入了储存点的概念。储存点在数据库应用程序中提供了专门的标记,当调用回滚方法的时候它可以作为参数使用。因此,使用 JDBC 3.0 API 的话,现在就可能在开始复杂的数据库交互之前设置储存点,并根据结果提交整个事务,或者回滚到储存点,将应用程序返回到一个已知的状态。

要设置存储点,请参考一下代码:

Savepoint savePoint = conn.setSavepoint("savepoint");

这样你就创建了一个名字为savepoint的存储点。要回滚到一个给定的存储点,只需将想要的 Savepoint 对象作为参数传送到回滚方法即可。例如,我们想回滚到savepoint存储点:

conn.rollback(savePoint);

而你不想再用存储点的时候,可以释放他们:

conn.releaseSavepoint(savePoint);

注意,当您提交或回滚一个事务时,根据确切的顺序和操作的类型,任何已创建的存储点都可能变成无效的。请参考 JDBC 3.0 API 规范或您的驱动程序手册以了解更多信息。


  jdbc API支持事务对数据库的加锁,并且提供了5种操作支持,2种加锁密度。

5种支持:

static int TRANSACTION_NONE                = 0&#59;

→禁止事务操作和加锁。

static  int TRANSACTION_READ_UNCOMMITTED    = 1&#59;

→允许脏数据读写(dirty reads)、重复读写(repeatable reads)和影象读写(phntom

reads)

static  int TRANSACTION_READ_COMMITTED      = 2&#59;

→禁止脏数据读写(dirty reads),允许重复读写(repeatable reads)和影象读写(phntom reads)

static  int TRANSACTION_REPEATABLE_READ     = 4&#59;

→禁止脏数据读写(dirty reads)和重复读写(repeatable reads),允许影象读写(phntom reads)

static  int TRANSACTION_SERIALIZABLE        = 8&#59;

→禁止脏数据读写(dirty reads)、重复读写(repeatable reads)和允许影象读写(phntom reads)

2种密度:

最后一项为表加锁,其余3~4项为行加锁。

      脏数据读写(dirty reads):当一个事务修改了某一数据行的值而未提交时,另一事务读取了此行值。倘若前一事务发生了回滚,则后一事务将得到一个无效的值(脏数据)。

      重复读写(repeatable reads):当一个事务在读取某一数据行时,另一事务同时在修改此数据行。则前一事务在重复读取此行时将得到一个不一致的值。

      影象读写(phantomreads):当一个事务在某一表中进行数据查询时,另一事务恰好插入了满足了查询条件的数据行。则前一事务在重复读取满足条件的值时,将得到一个额外的“影象“值。

     Jdbc根据数据库提供的缺省值来设置事务支持及其加锁,当然,也可以手工设置:

    setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)&#59;

可以查看数据库的当前设置:

    getTransactionIsolation()

需要注意的是,在进行受动设置时,数据库及其驱动程序必须得支持相应的事务操作操作才行。

       上述设置随着值的增加,其事务的独立性增加,更能有效的防止事务操作之间的冲突;同时也增加了加锁的开销,降低了用户之间访问数据库的并发性,程序的运行效率也回随之降低。因此得平衡程序运行效率和数据一致性之间的冲突。一般来说,对于只涉及到数据库的查询操作时,可以采用TRANSACTION_READ_UNCOMMITTED方式;对于数据查询远多于更新的操作,可以采用TRANSACTION_READ_COMMITTED方式;对于更新操作较多的,可以采用TRANSACTION_REPEATABLE_READ;在数据一致性要求更高的场合再考虑最后一项,由于涉及到表加锁,因此会对程序运行效率产生较大的影响。

另外,在oracle中数据库驱动对事务处理的缺省值是TRANSACTION_NONE,即不支持事务操作,所以需要在程序中手动进行设置。



解锁oracle账户
开发报告说某个账户无法登录,并报告错误该账户locked,登录查看;

SQL> select username,account_status from dba_users;

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
abc                            LOCKED
OUTLN                          OPEN
SYS                            OPEN
SYSTEM                         OPEN

先将其解锁
alter user abc account unlock;

然后查看dba_profiles
SQL> select * from dba_profiles;

PROFILE                        RESOURCE_NAME                    RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
DEFAULT                        COMPOSITE_LIMIT                  KERNEL   UNLIMITED
DEFAULT                        SESSIONS_PER_USER                KERNEL   UNLIMITED
DEFAULT                        CPU_PER_SESSION                  KERNEL   UNLIMITED
DEFAULT                        CPU_PER_CALL                     KERNEL   UNLIMITED
DEFAULT                        LOGICAL_READS_PER_SESSION        KERNEL   UNLIMITED
DEFAULT                        LOGICAL_READS_PER_CALL           KERNEL   UNLIMITED
DEFAULT                        IDLE_TIME                        KERNEL   UNLIMITED
DEFAULT                        CONNECT_TIME                     KERNEL   UNLIMITED
DEFAULT                        PRIVATE_SGA                      KERNEL   UNLIMITED
DEFAULT                        FAILED_LOGIN_ATTEMPTS            PASSWORD 10
DEFAULT                        PASSWORD_LIFE_TIME               PASSWORD 180

将参数FAILED_LOGIN_ATTEMPTS设置为unlimited,以后就再也不会受到此问题的困扰
alter profile default limit failed_login_attempts unlimited;





分享到:
评论

相关推荐

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    《深入理解JDBC Driver 3.0:聚焦SQL Server JDBC》 在IT行业中,数据库连接是应用程序与数据存储之间的桥梁,而JDBC(Java Database Connectivity)则是Java平台中用于访问数据库的标准API。JDBC Driver 3.0是针对...

    sqlserver驱动包 jdbc驱动 sqljdbc.jar和sqljdbc4.jar

    SQL Server驱动包是用于Java应用程序通过JDBC(Java Database Connectivity)接口与Microsoft SQL Server数据库进行交互的必备组件。本文将详细介绍这两个重要的驱动文件——sqljdbc.jar和sqljdbc4.jar,以及如何...

    sqljdbc和sqljdbc4 sqlserver最新驱动

    SQLJDBC和SQLJDBC4是Microsoft为Java应用程序提供的用于连接SQL Server数据库的驱动程序。这两个版本都是JDBC(Java Database Connectivity)驱动,允许Java开发者在应用程序中与SQL Server进行交互。下面将详细介绍...

    sap JDBC数据源配置

    ### SAP JDBC 数据源配置 #### 引言与目的 本文档旨在提供详细的步骤指南,用于在SAP NetWeaver 7.0 和 SAP Composite Environment (CE) 7.1 上配置 JDBC 数据源和系统。通过这些步骤,用户可以创建一个独立的数据...

    Spring Data JDBC与JDBC的区别

    Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...

    mysql jdbc 驱动 适用于5.6版本及以下数据库

    mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及...

    mysql jdbc 驱动 适用于5.7及以上版本数据库

    mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上...

    sqljdbc41、sqljdbc42的官方jar包

    在Java编程语言中,JDBC(Java Database Connectivity)是一个核心的API,用于连接Java应用程序与各种类型的数据库。这里我们关注的是两个特定版本的Microsoft SQL Server的JDBC驱动:sqljdbc41.jar和sqljdbc42.jar...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    在给定的压缩包文件中,包含了三个不同版本的达梦JDBC驱动,分别是Dm7JdbcDriver16.jar、Dm7JdbcDriver17.jar和Dm7JdbcDriver18.jar。 1. **JDBC驱动介绍**: JDBC是Java中用于与各种数据库进行交互的标准接口,它...

    自学jdbc心得体会

    JDBC 基础知识点 JDBC(Java Database Connectivity)是一种Java标准的数据库连接API,它允许Java程序访问各种关系数据库。下面是JDBC的基础知识点: 一、JDBC原理概述 * JDBC是一套协议,由Sun定义的一组接口,...

    jdbc jdbc jdbc

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现为Oracle公司)开发并定义,作为Java平台的一部分,允许Java应用程序通过编写Java代码来访问...

    sql server2000 jdbc

    SQL Server 2000 JDBC 是Java编程语言与Microsoft SQL Server 2000数据库进行交互的一种重要方式。JDBC(Java Database Connectivity)是Java API,允许Java应用程序通过Java虚拟机(JVM)与各种数据库建立连接。在...

    Access_JDBC30

    标题 "Access_JDBC30" 暗示了这是一个与Microsoft Access数据库相关的Java JDBC驱动程序。JDBC(Java Database Connectivity)是Java编程语言中用于连接和操作数据库的标准接口。这个jar包,"Access_JDBC30.jar",...

    kingbaseV8 jdbc 驱动

    KingbaseV8 JDBC驱动是连接KingbaseV8数据库的重要组件,允许Java应用程序通过JDBC(Java Database Connectivity)接口与数据库进行交互。JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了...

    access的jdbc驱动

    Access的JDBC驱动是Java数据库连接(Java Database Connectivity, JDBC)的一种实现,它允许Java程序与Microsoft Access数据库进行交互。在JDK 1.8之后,Oracle公司不再默认提供对ODBC(Open Database Connectivity...

    sqljdbc42.jar、sqljdbc41.jar 更新日期2017-12-21

    标题中的"sqljdbc42.jar、sqljdbc41.jar 更新日期2017-12-21"指的是Microsoft SQL Server的Java Database Connectivity (JDBC) 驱动的两个不同版本,它们分别对应于Java SE 7和Java SE 8的兼容性。JDBC驱动是Java...

    java jdbc 需要包

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一组接口和类。它提供了一种标准化的方法,让程序员可以使用SQL语句访问数据库,而无需关心具体的数据库实现细节。在Java应用...

    sqljdbc4-3.0.jar

    标题“sqljdbc4-3.0.jar”指向的是一个特定版本的Microsoft SQL Server JDBC驱动程序,它是用于在Java应用程序中连接和操作SQL Server数据库的桥梁。这个版本的驱动(3.0)支持与SQL Server 2000的兼容性。 在描述...

    Windowssever 2016 连sqlsever的jar包 JDK1.7/1.8 sqljdbc41/sqljdbc42

    `sqljdbc41`和`sqljdbc42`是SQL Server特有的一套JDBC驱动,分别对应JDBC 4.1和JDBC 4.2标准,适用于JDK 7和JDK 8。 1. **JDBC 4.1 (sqljdbc41.jar)**:这个版本的驱动支持JDK 7,它引入了新的特性,如异步操作、...

Global site tag (gtag.js) - Google Analytics