说明:
这是工作的一个实际应用,在此作一下备案、东西不难但容易忘记。里面主要包括
1、XML配置信息加载
2、单例模式使用
3、ThreadLocal使用,不管在此意义不大
4、WebLogic数据源使用,获取不到数据源将使用JDBC连接
一、XML配置
<?xml version="1.0" encoding="UTF-8"?> <config> <!-- JDBC的配置信息 --> <db-info> <driver-name>oracle.jdbc.driver.OracleDriver</driver-name> <url>jdbc:oracle:thin:@localhost:1521:orcl</url> <user-name>name</user-name> <password>password</password> </db-info> <!-- 数据源的配置信息 --> <datasoure-info> <initContextFactory>weblogic.jndi.WLInitialContextFactory</initContextFactory> <provider-url>jdbc:oracle:thin:@localhost:1521:orcl</provider-url> <jndi-name>jndiName</jndi-name> </datasoure-info> </config>
二、POJO用来存读到的配置属性
public class JdbcConfig {
// jdbc配置
private String driverName;
private String userName;
private String password;
private String url;
// weblogic数据源的配置
private String initContextFactory;
private String providerUrl;
private String jndiName;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
................................................
}
三、单例加载配置文件
看到空间的另外一篇博客可以知道,这种单例很显然不是最佳的写法;而且dom4j的解析也有一点冗余哦,不过影响不大。
public class XmlConfigReader {
// 懒汉式(用的时候再创建),延迟加载
private static XmlConfigReader instance = null;
// 保存jdbc相关配置信息
private JdbcConfig jdbcConfig = new JdbcConfig();
// 构造方法让其private,这就不让外界利用new创建此类实例
private XmlConfigReader() {
SAXReader reader = new SAXReader();
// 从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。此方法通过系统类加载器
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("dbsource.xml");
try {
Document doc = reader.read(in);
// 取得jdbc相关配置信息
Element driverNameElt = (Element) doc
.selectObject("/config/db-info/driver-name");
Element urlElt = (Element) doc.selectObject("/config/db-info/url");
Element userNameElt = (Element) doc
.selectObject("/config/db-info/user-name");
Element passwordElt = (Element) doc
.selectObject("/config/db-info/password");
// 取得WebLogic数据源的相关信息
Element initContextFactory = (Element) doc
.selectObject("/config/datasoure-info/initContextFactory");
Element providerUrl = (Element) doc
.selectObject("/config/datasoure-info/provider-url");
Element jndiname = (Element) doc
.selectObject("/config/datasoure-info/jndi-name");
// jdbc取得相关的配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
// 数据源取得相关的配置
jdbcConfig.setInitContextFactory(initContextFactory
.getStringValue());
jdbcConfig.setProviderUrl(providerUrl.getStringValue());
jdbcConfig.setJndiName(jndiname.getStringValue());
} catch (DocumentException e) {
e.printStackTrace();
}
}
// 静态方法访问时,直接访问不需要实例化
public static synchronized XmlConfigReader getInstance() {// synchronized表示同时只能一个线程进行实例化
if (instance == null) {// 如果两个进程同时进入时,同时创建很多实例,不符合单例
instance = new XmlConfigReader();
}
return instance;
}
public JdbcConfig getJdbcConfig() {
return jdbcConfig;
}
}
四、数据库的连接
public class Conn {
private static final ThreadLocal<Connection> connectLocal = new ThreadLocal<Connection>();
static JdbcConfig jdbcConfig = XmlConfigReader.getInstance()
.getJdbcConfig();
public static Connection getJDBCConnection() {
Connection conn = (Connection) connectLocal.get(); // 获得连接
try {
if (conn == null) { // 如果连接不存在,就创建一个新的连接
Class.forName(jdbcConfig.getDriverName().trim());
conn = DriverManager.getConnection(jdbcConfig.getUrl().trim(),
jdbcConfig.getUserName(), jdbcConfig.getPassword()
.trim());
connectLocal.set(conn); // 保存到ThreadLocal中
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static Connection getConnection() {
Connection conn = (Connection) connectLocal.get(); // 获得连接
Hashtable<String, String> ht = new Hashtable<String, String>();
ht.put(Context.INITIAL_CONTEXT_FACTORY, jdbcConfig
.getInitContextFactory().trim());
ht.put(Context.PROVIDER_URL, jdbcConfig.getProviderUrl().trim());
Context ctx = null;
try {
ctx = new InitialContext(ht);
DataSource ds = (DataSource) ctx.lookup(jdbcConfig.getJndiName()
.trim());
conn = ds.getConnection();
connectLocal.set(conn); // 保存到ThreadLocal中
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ctx != null) {
ctx.close();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
if (conn == null) {
conn = getJDBCConnection(); //JDBC连接
}
return conn;
}
public static void CloseConnection() { // 如果这样做,ThreadLocal的性能就不能得到体现了.
Connection conn = (Connection) connectLocal.get();
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace(); // 出现异常建议上抛,在最上层做提示处理.
} finally {
connectLocal.remove();
}
}
}
这里如何数据源里面获得的conn是null,将调用JDBC的连接。