1、JDBC的连接有2种:直连;连接池;
2、Weblogic Server中的JDBC配置,包括:配置连接池、配置数据源;

3、使用连接池的优势:节省时间(初始连接数、最大连接数据)、装用户信息;
4、连接池、数据源(MySqlJNDI)的配置、程序演示……
(结合WLS的控制台进行介绍,注意在WLS中添加MY SQL包)
…… ……
5、Weblogic Server中的事务处理
①事务的概念:(ACID:原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)
②分布式事务:事务的参与者、支持事务的服务器、资源服务器、事务管理服务器分别位于不同的分布式系统的不同节点上。通常采用两阶段提交协议:
阶段一:开始向事务涉及到的全部资源发送提交信息,任意一个资源异常就可以决定整个事务取消。否则事务正常执行,并将所有资源的更新写入永久性的日志中;
阶段二:在前阶段没有异常的情况下,所有能被定位和控制的资源管理器都将开始执行真正的数据更新;
6、JDBC中的简单事务
try {
……
conn.setAutoCommit(false); //禁止自动提交
……//SQL语句
conn.commit( ); //事务提交
}
catch(……) {
……
conn.rollback( ); //事务回滚
}
7、Weblogic Server中的事务
J2EE有2套规范来支持分布式事务:
Java Transaction API(JTA):高层与协议、实现无关的API。应用程序和应用服务器可以使用JTA访问事务;
Java Transaction Service(JTS):是对JTA的实现;WLS同时支持以上2者。
8、WLS下的JTA开发实例:
……
9、JDBC多池:
多池是连接池的池。连接池中的所有连接共享一个公共的数据库实例和一个公共的用户,以访问资源。借助于多池,可以针对每个连接池使用不同的用户,指向不同的数据库实例。多池基于高可用性和负载均衡算法。
10、如果要在WLS中使用一个没有驱动程序包的JDBC,则要注意把DB的驱动包,配置到StartWeblogic.cmd文件中。
11、最佳实践:
Ø 在使用连接池之后,应马上关闭连接。
Ø 把数据库连接池的初始容量设置为最大容量。
Ø 建立到数据库的连接时,应使用DataSource技术代替DriverManager这样的老方法。因为后者是一个同步的类,意味着一次只有一个线程执行可以运行。而前者是多线程的。
Ø 应使用正确的顺序(与打开时相反的顺序)来释放来释放JDBC对象,并在JDBC访问的finally块中管理Connection对象。并且在finally的try{}catch{}中,一次只能有一个close()语句,否则,前一个出现异常,后面的语句就不会被执行。
Ø 在WLS中,实现事务有2种方式:使用WLS的JTA驱动程序和JDBC的AutoCommit(false)属性。但是在一个有EJB和JMS服务的企业J2EE中,决不应该使用AutoCommit显示地申明事务,而应该使用JTA驱动程序来实现。
事物的开销十分昂贵,特别是两阶段提交。因此,只有在必须使用事务的时候,才使用事务。要尽可能快地提交或回滚事务。
程序代码:
文件一、MyContext .java
package study1.Comm;
import javax.naming.*;
import java.util.Properties;
/**
*说明:
* MyContext主要通过getInitialContext()方法获得WLS的上下文环境,以方便JMS、JNDI等各种操作。
* 编写:
* TANMB 2007-10-30
*/
public class MyContext {
public MyContext() {
}
//取得Weblogic Server的初始化环境,以进行JNDI查询。
public static Context getInitialContext() throws Exception {
String url = "t3://127.0.0.1:7001";//Weblogic Server的地址、端口号
String user = "weblogic";//Weblogic Server的用户名和口令
String password = "weblogic";
Properties props = null;
try {
props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, url);
if (user != null) {
props.put(Context.SECURITY_PRINCIPAL, user);
props.put(Context.SECURITY_CREDENTIALS,
password == null ? "" : password);
}
return new InitialContext(props);
}
catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
}
文件二、MyDbcp .java
package study1.DBCP;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Properties;
import javax.rmi.PortableRemoteObject;
import study1.Comm.MyContext;
/**
*说明:
* Weblogic Server中DBCP的配置及使用介绍
*
*编写:
* TANMB 2007-11-1
*/
public class MyDbcp {
public MyDbcp() {
}
public static void main(String[] args) {
MyDbcp myDbcp1 = new MyDbcp();
DataSource ds = null;
Context ctx = null;
Connection con = null;
try {
ctx = MyContext.getInitialContext();
//MySqlJNDI为数据源在JNDI中的名称
ds = (javax.sql.DataSource) ctx.lookup("MySqlJNDI");
}
catch (Exception ex) {
System.out.println("Init Error:" + ex);
ex.printStackTrace();
}
Statement statement = null;
ResultSet rst = null;
try {
con = ds.getConnection();
if (con == null)
System.out.println("con is null");
statement = con.createStatement();
rst = statement.executeQuery("select * from student ");
while (rst.next()) {
System.out.print("\t" + rst.getLong("stuid"));
System.out.print("\t" + rst.getString("stuname"));
System.out.print("\t" + rst.getInt("departid"));
System.out.println("\t" + rst.getString("memo"));
}
rst.close();
statement.close();
}
catch (Exception ex) {
System.out.println("Error Code=" + ex.getMessage());
ex.printStackTrace();
}
finally {//注意,释放资源的顺序,和打开的顺序相反。
try {
if(rst!=null) rst.close();
}
catch (Exception ex) {}
try {
if (statement != null) statement.close();
}
catch (Exception ex) {}
try {
if (con != null) con.close();
}
catch (Exception ex) {}
}
}
}
////////////////////////////JTA////////////////////////////////////////////////////
MyJTA .java
package study1.DBCP;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import java.util.Properties;
import javax.rmi.PortableRemoteObject;
import javax.transaction.*;
import study1.Comm.MyContext;
/**
* 说明:
* WLS的事务程序示例
* 编写:
* TANMB 2007-11-1
*/
public class MyJTA {
public MyJTA() {
}
public static void main(String[] args) {
MyJTA myJTA1 = new MyJTA();
DataSource ds = null;
Context ctx = null;
Connection conn = null;
UserTransaction tx = null;
try {
/*
建立事务:
在WLS中实现JTA的第一步是创建UserTransaction的实例。UserTransaction事务
可以控制并发线程的执行。一个事务的并发线程可以是各种服务,如EJB、JDBC、JMS等。
*/
ctx = MyContext.getInitialContext();
tx = (UserTransaction) ctx.lookup(
"javax.transaction.UserTransaction");
/*
事务开始。之后针对数据库的任何操作都处于这个事务的范围之内,包括JDBC的调用
及其它依赖于JDBC的服务。
*/
tx.begin();
//查找数据源
ds = (javax.sql.DataSource) ctx.lookup("MySqlJNDI");
}
catch (Exception ex) {
System.out.println("Init Error:" + ex.getMessage());
ex.printStackTrace();
}
Statement stmt = null;
ResultSet rst = null;
try {
//建立连接
conn = ds.getConnection();
//执行与资源有关的操作
stmt = conn.createStatement();
stmt.executeUpdate(
"insert into student values(200801,'stu',1,'test')");
//如没有异常,则提交事务
tx.commit();
System.out.println("*********Success!**********");
}
catch (Exception ex) {
try {
tx.rollback();//回滚事务
}
catch (Exception e) {}
System.out.println("Error Msg="+ex.getMessage());
}
finally {
try {
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();
}
catch (Exception ex) {}
}
}
}
发表于 @ 2007年12月25日 17:18:00|评论(loading...)