Java Database Connectivity (JDBC) API是Java编程语言与各种数据库之间的数据库独立连接的行业标准。JDBC API为基于SQL的数据库访问提供了API。JDBC技术允许您使用Java编程语言为需要访问企业数据的应用程序开发“一次编写,随处运行”的功能。使用支持JDBC技术的驱动程序,您甚至可以在异构环境中连接所有公司数据。
无论是在云中还是在本地,使用Oracle自治数据库开发Java应用程序都是快速而简单的。Java开发人员可以利用最新的特性,如Oracle自治数据库、性能自调优、高可用性、内存处理和可插拔的数据库,来设计和开发高性能、可伸缩和可靠的应用程序。Oracle数据库19c和18c JDBC驱动程序引入了很少的增强和一个新的属性文件(ojdbc.properties),它简化了到自治事务处理(ATP)和自治数据仓库(ADW)的连接。
什么是UCP(Universal Connection Pool)?
UCP是通用连接池。它是一个单独的连接池,用于处理各种连接,JDBC、JCA、LDAP等。它支持非oracle JDBC驱动程序和到非oracle数据库的JDBC连接。当用于Oracle JDBC到Oracle数据库的连接时,它提供了旧的JDBC隐式连接缓存(Implicit Connection Cache)的所有特性等。
使用Oracle JDBC和UCP的好处
UCP广泛应用于Oracle产品中。如果用Oracle数据库,使用Oracle的JDBC,我们建议使用UCP,因为它能够优雅地处理故障转移、管理连接、资源等。可以充分发挥数据库的性能,还可以在高可用、容灾、安全等方面有很大改善。比如利用应用连续性可以实现业务不宕机。
不同JDBC版本的生命周期
下面链接是JDK 11中用于各种JDBC规范(4.3、4.2、4.2等)的sql摘要
https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/package-summary.html
https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19c-downloads.html
19.3 JDBC各文件的作用
JDBC、JDK和数据库的对应关系
不同版本的JDBC和不同版本数据库之间的支持
不同版本数据库和不同版本对应支持的JDBC版本
快速的上手使用Oracle通用连接池
这个快速入门指南帮助Java开发人员成功地建立到Oracle数据库的连接,从下面简单的步骤来开始:
https://www.oracle.com/database/technologies/develop-java-apps-using-jdbc.html
步骤一:前置条件
需要本地的或者云端的Oracle数据库
安装JDK8
https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
下载18.3 JDBC driver (ojdbc8.jar)
https://www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.html
步骤二:建立数据库链接
下载java代码
从github下载DataSourceSample.java或UCPSample.java
wget https://raw.githubusercontent.com/oracle/oracle-db-examples/master/java/jdbc/ConnectionSamples/DataSourceSample.java wget https://raw.githubusercontent.com/oracle/oracle-db-examples/master/java/jdbc/ConnectionSamples/UCPSample.java修改java代码,更新数据库的验证信息
DB_URL = "jdbc:oracle:thin:@myhost:1521/myorcldbservicename" DB_USER = "hr" and DB_PASSWORD ="hr"测试使用的是HR.EMPLOYEES表。如果您的数据库中没有HR模式,请修改代码中的表和列,以使用您确实可以访问的表,或者为了测试目的使用简单的查询“Select sysdate from dual”
步骤三:编译和运行代码
编译java代码
javac -classpath ./pb/ojdbc8.jar:. DataSourceSample.java javac -classpath ./pb/ojdbc8.jar:./pb/ucp.jar:. UCPSample.java运行java代码
java -classpath ./pb/ojdbc8.jar:. DataSourceSample java -classpath ./pb/ojdbc8.jar:./pb/ucp.jar:. UCPSample注意:如果使用的是JDK7或JDK6,那么必须使用ojdbc7.jar或ojdbc6.jar,数据库12.1.0.2或12.1.0.1。使用java -version检查JDK的版本。使用java -jar -ojdbc8.jar检查JDBC驱动的版本
JDBC UCP 12.2 Hands-on手册
如果上面的测试不过瘾,可以通过下面的手册继续练习。很全面很详细的结束使用JDBC和UCP,包含源代码
https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r2/appdev/JDBC_UCP_HOL_2016/JDBC_UCP_HOL_2016.html
https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r2/appdev/JDBC_UCP_HOL_2016/files/jdbchol.zip
https://www.oracle.com/database/technologies/universal-connection-pool-faq.html
Java程序方面的优化
下面是Oracle PM写的关于优化java应用的文档,可做参考
https://blogs.oracle.com/developers/revisiting-the-performance-and-scalability-of-java-applications-that-use-rdbmses
http://db360.blogspot.com/2018/03/optimizing-performance-scalability-of.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/jdbc-developers-guide.pdf
使用19c and 18.3 JDBC连接Oracle Autonomous Database (ATP or ADW)
https://www.oracle.com/technetwork/database/application-development/jdbc/documentation/atp-5073445.html
https://www.oracle.com/technetwork/database/application-development/jdbc-eecloud-troubleshooting-tips.html
https://www.oracle.com/database/technologies/appdev/jdbc-db-cloud.html
JDBC的常见问答
该部分记录了大部分常见的关于JDBC的疑问和推荐
https://www.oracle.com/database/technologies/faq-jdbc.html
https://www.oracle.com/technetwork/cn/database/enterprise-edition/jdbc-faq-090281-zhs.html,这个是中文链接,下面挑几个比较常见的
如何生成jdbc的跟踪文件默认情况下,跟踪输出会发到 System.out。要发送到其他地方,可以使用属性 oracle.jdbc.LogFile
java -Doracle.jdbc.LogFile=/tmp/jdbc.log MyApp或通过调用 setLogStream api。oracle.jdbc.driver.OracleLog.setLogStream(System.err), 设置日志流也会启动跟踪
JDBC的demo(需要安装example安装文件)
可以从UNIX平台$ORACLE_HOME/jdbc/demo/demo.tar或者从Windows系统$ORACLE_HOME/jdbc/demo/demo.zip目录下载
INSERT或UPDATE操作缓慢
默认情况下,一旦您执行语句,驱动程序就会提交所有 INSERT 和 UPDATE。这在 JDBC 中称为 autoCommit 模式。可以通过关闭 autoCommit 并使用显式提交语句来获得更高的性能。请使用Connection类的 setAutoCommit入口点关闭AutoCommit:
connection.setAutoCommit(false); 有关批量调用 INSERT 和 UPDATE 的 Oracle 扩展的信息,请参见 JDBC 文档中的“批量更新”。批处理这些命令可以实现比关闭AutoCommit 更快的速度
为什么不能创建一个执行 select * from tab where id in (?, ?, ?, ...) 的 PreparedStatement?
问题是 RDBMS 不支持 IN 子句中元素的绑定参数。这是数据库的限制,不是驱动程序的限制。
如果连接我SYSDBA或SYSOPER
唯一的方法是在连接时使用 Properties 对象,而不是以字符串形式指定用户名和密码。将用户名输入“user”属性,并将密码输入“password”属性。然后,将模式输入“internal_logon”属性。类似以下所示:
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "tiger");
props.put("internal_logon", "sysoper");
Connection conn = DriverManager.getConnection (url, props);
使用瘦驱动程序以 SYSDBA 或 SYSOPER 身份连接时,必须将 RDBMS 配置成使用密码文件。请参见“Oracle 数据库管理员指南”中的“创建和维护密码文件”。
DriverManager 与 DataSource 之间有何区别?
使用类 java.sql.DriverManager指定用于创建连接的第一个JDBC版本。事实证明,这种方法不够灵活,于是后来的JDBC规范版本定义了另一种使用DataSource创建连接的方式。建议使用DataSource。
DataSource提供了一种更灵活的创建连接的方式。有 DataSource之后,从DataSource获取连接就像用DriverManager一样简单。DataSource旨在与JNDI一起使用,但您不使用JNDI也可使用 DataSource。除了创建新连接之外,DataSource 还可以执行其他任务。尤其是,DataSource 可以实现连接缓存。DataSource 现在是创建连接的首选方式。
下面是从 DataSource 获取连接的非常简单的方式:
ds = new oracle.jdbc.pool.OracleDataSource();
ds.setURL(myURL);
conn = ds.getConnection(user, password);
应该使用哪个连接缓存,OracleConnectionCacheImpl、隐式连接缓存,还是通用连接池 (UCP)?
应该使用新的通用连接池UCP。这种新的连接缓存机制与驱动程序、协议和数据库无关。它支持与非Oracle数据库的非JDBC连接和JDBC连接。使用Oracle JDBC时,它提供以下 Oracle 高级特性:
连接属性,用于条带化和重用连接
每个VM一个连接缓存管理器,用于管理一个或多个连接缓存
放弃了连接超时,以回收空闲的签出连接等
运行时连接负载平衡,可将工作分配给性能更佳的实例
不再支持Oracle隐式连接缓存。请注意,11.1中取消了对旧的连接缓存OracleConnectionCacheImpl的支持
JDBC开发者指南
https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/toc.htm
UCP开发者指南
https://docs.oracle.com/en/database/oracle/oracle-database/19/jjucp/toc.htm
更多JDBC开发知识
https://www.oracle.com/database/technologies/appdev/jdbc.html
更多测试脚本,从下面链接获取
https://github.com/oracle/oracle-db-examples/tree/master/java
通过Node.js, Python, R, PHP and Ruby连接Oracle数据库云服务
https://www.oracle.com/database/technologies/scripting-languages/cloud.html
https://www.oracle.com/database/technologies/scripting-languages/onprem-apps-dbcs.html
https://www.oracle.com/database/technologies/scripting-languages.html
https://www.oracle.com/database/technologies/appdev/rest.html
Reference
https://www.oracle.com/database/technologies/faq-jdbc.html
https://www.oracle.com/database/technologies/universal-connection-pool-faq.html
https://www.oracle.com/database/technologies/appdev/jdbc.html
https://www.oracle.com/technetwork/cn/database/enterprise-edition/jdbc-faq-090281-zhs.html
https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r2/appdev/JDBC_UCP_HOL_2016/JDBC_UCP_HOL_2016.html
http://db360.blogspot.com/
https://www.oracle.com/database/technologies/appdev/jdbc.html
https://www.oracle.com/database/technologies/scripting-languages/cloud.html
http://db360.blogspot.com/2006/08/oracle-database-programming-using-java_01.html
https://datubaze.files.wordpress.com/2015/11/kuasi_mensah_oracle_database_prog_using_java_2005.pdf
http://web.stanford.edu/dept/itss/docs/oracle/10gR2/java.102/b14355/getsta.htm
https://www.oracle.com/database/technologies/appdev/ojvm.html
https://www.oracle.com/technetwork/articles/java/index-141532.html
https://www.oracle.com/technetwork/java/index-138427.html
https://www.oracle.com/technetwork/cn/database/enterprise-edition/jdbc-faq-090281-zhs.html
https://blogs.oracle.com/dev2dev/get-oracle-jdbc-drivers-and-ucp-from-oracle-maven-repository-without-ides