package com.songbx; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameNotFoundException; import javax.naming.NamingException; import javax.sql.DataSource; import org.hibernate.HibernateException; import org.hibernate.cfg.Environment; import org.hibernate.util.NamingHelper; public class DatasourceConnectionProvider { private DataSource ds; private String user; private String pass; public DataSource getDataSource() { return ds; } public void setDataSource(DataSource ds) { this.ds = ds; } public void configure(Properties props) throws HibernateException { String jndiName = props.getProperty(Environment.DATASOURCE); if (jndiName==null) { String msg = "datasource JNDI name was not specified by property " + Environment.DATASOURCE; throw new HibernateException(msg); } user = props.getProperty(Environment.USER); pass = props.getProperty(Environment.PASS); try { ds = (DataSource) NamingHelper.getInitialContext(props).lookup(jndiName); } catch (Exception e) { throw new HibernateException( "Could not find datasource", e ); } if (ds==null) { throw new HibernateException( "Could not find datasource: " + jndiName ); } } public Connection getConnection() throws SQLException { if (user != null || pass != null) { return ds.getConnection(user, pass); } else { return ds.getConnection(); } } public void closeConnection(Connection conn) throws SQLException { conn.close(); } public void close() {} public static void bind(Context ctx, String name, Object val) throws NamingException { try { ctx.rebind(name, val);//将名称绑定到对象。 } catch (Exception e) { // NameParser getNameParser(String name)检索与指定上下文关联的解析器。 //parse(name)将某一名称解析成其组件。 Name n = ctx.getNameParser("").parse(name); while ( n.size() > 1 ) {//返回此名称中的组件数。 String ctxName = n.get(0); Context subctx=null; try { subctx = (Context) ctx.lookup(ctxName); } catch (NameNotFoundException nfe) {} if (subctx!=null) { ctx = subctx; } else { ctx = ctx.createSubcontext(ctxName);//创建并绑定一个新上下文。 } n = n.getSuffix(1);//创建一个名称,其组件由此名称中组件的前缀组成。 } ctx.rebind(n, val); } } }