KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > jdbc > xa > XAConnectionFactory


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6
7 package org.jfox.jdbc.xa;
8
9 import java.io.PrintWriter JavaDoc;
10 import java.sql.Connection JavaDoc;
11 import java.sql.SQLException JavaDoc;
12 import javax.sql.XAConnection JavaDoc;
13 import javax.sql.XADataSource JavaDoc;
14
15 import org.jfox.ioc.logger.Logger;
16 import org.jfox.pool.ObjectFactory;
17 import org.jfox.pool.PoolableObject;
18
19 /**
20  * 利用XADataSource,负责生成 XAConnection,并负责 enlist 其 XAResource
21  *
22  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
23  */

24
25 public class XAConnectionFactory implements ObjectFactory {
26     private XADataSource JavaDoc xads = null;
27
28     private String JavaDoc url = "";
29     private String JavaDoc user = "";
30     private String JavaDoc password = "";
31     private int transactionIsolation = Connection.TRANSACTION_READ_COMMITTED;
32
33     private XAConnectionPool pool = null;
34
35     private static Logger logger = Logger.getLogger(XAConnectionFactory.class.getName());
36
37     public XAConnectionFactory(String JavaDoc url, String JavaDoc user, String JavaDoc password) {
38         this.url = url;
39         this.user = user;
40         this.password = password;
41         try {
42 // xads = XADataSourceFactory.getXADataSource(url);
43
xads = createXADataDataSource();
44         }
45         catch(Exception JavaDoc e) {
46             e.printStackTrace();
47             throw new RuntimeException JavaDoc("create xadatasource error", e);
48         }
49     }
50
51     String JavaDoc getUser() {
52         return user;
53     }
54
55     String JavaDoc getPassword() {
56         return password;
57     }
58
59     String JavaDoc getDbURL() {
60         return url;
61     }
62
63     public Class JavaDoc getObjectClass() {
64         return XAConnection JavaDoc.class;
65     }
66
67     public PoolableObject makeObject() throws Exception JavaDoc {
68         logger.debug("make object");
69         PoolableXAConnection poolxaconn = new PoolableXAConnection(getXAConnection(user, password), transactionIsolation, url, user, password);
70         poolxaconn.setPool(pool);
71         return poolxaconn;
72     }
73
74     /**
75      * 用不同池的用户名和密码连接,不返回给池,设置 notPoolable
76      */

77     PoolableObject makeObject(String JavaDoc user, String JavaDoc password) throws Exception JavaDoc {
78         logger.debug("make object by " + user + " & " + password);
79         PoolableXAConnection pxaconn = new PoolableXAConnection(getXAConnection(user, password), transactionIsolation, url, user, password);
80         pxaconn.notPoolable();
81         return pxaconn;
82     }
83
84     public void destroyObject(PoolableObject object) throws Exception JavaDoc {
85         logger.debug("destroyObject " + object);
86         PoolableXAConnection poolXaConn = (PoolableXAConnection) object;
87         poolXaConn.close();
88         poolXaConn = null;
89     }
90
91     /**
92      * isMarkedError: 在操作过程中,该 XAConnection 已经出错了
93      * isPoolable: 使用特别的 getXAConnection(user,password) 创建,不进入池
94      *
95      * @param object
96      * @return
97      */

98     public boolean validateObject(PoolableObject object) {
99         boolean isAvailable = PoolableXAConnection.class.isAssignableFrom(object.getClass()) && object.isAvailable();
100         logger.debug("validate object " + object + " " + isAvailable);
101         return isAvailable;
102     }
103
104     XAConnection JavaDoc getXAConnection(String JavaDoc user, String JavaDoc password) throws SQLException JavaDoc {
105         return xads.getXAConnection(user, password);
106     }
107
108     int getLoginTimeout() throws SQLException JavaDoc {
109         return xads.getLoginTimeout();
110     }
111
112     void setLoginTimeout(int seconds) throws SQLException JavaDoc {
113         xads.setLoginTimeout(seconds);
114     }
115
116     PrintWriter JavaDoc getLogWriter() throws SQLException JavaDoc {
117         return xads.getLogWriter();
118     }
119
120     void setLogWriter(PrintWriter JavaDoc out) throws SQLException JavaDoc {
121         xads.setLogWriter(out);
122     }
123
124     void setPool(XAConnectionPool pool) {
125         this.pool = pool;
126     }
127
128     void setTransactionIsolation(int level) throws SQLException JavaDoc {
129         transactionIsolation = level;
130     }
131
132     private XADataSource JavaDoc createXADataDataSource() throws Exception JavaDoc {
133         String JavaDoc protocol = getProtocol();
134         ClassLoader JavaDoc loader = this.getClass().getClassLoader();
135         String JavaDoc className = this.getClass().getPackage().getName() + "." + protocol.toUpperCase() + "XADataSource";
136         Class JavaDoc clz = loader.loadClass(className);
137         AbstractXADataSource xadsf = (AbstractXADataSource)clz.getConstructor(new Class JavaDoc[]{String JavaDoc.class}).newInstance(new Object JavaDoc[]{url});
138         return xadsf;
139     }
140
141     private String JavaDoc getProtocol() {
142         int index1 = url.indexOf(":");
143         int index2 = url.indexOf(":", index1 + 1);
144         String JavaDoc protocol = url.substring(index1 + 1, index2);
145         return protocol;
146     }
147
148     public static void main(String JavaDoc[] args) {
149
150     }
151 }
152
Popular Tags