`
dycsos123ok
  • 浏览: 81691 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

*****Java之WebLogi数据源的使用*****

    博客分类:
  • java
阅读更多

 说明:

 

这是工作的一个实际应用,在此作一下备案、东西不难但容易忘记。里面主要包括

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的连接。

分享到:
评论
2 楼 dycsos123ok 2012-08-09  
provider-url里面的参数配置应该是t3://localhost:7001;不好意思。
1 楼 dycsos123ok 2012-08-06  
不好意思,标题写错了,不改了!

相关推荐

Global site tag (gtag.js) - Google Analytics