import java.sql.Connection; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class ConnectionManager ... { private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); private static Context context; private static DataSource ds; static...{ try ...{ context=new InitialContext(); ds=(DataSource) context.lookup("jndiName"); } catch (NamingException e) ...{ e.printStackTrace(); throw new RuntimeException(e); } } public static Connection getConnection()throws Exception...{ if(tl.get()==null||tl.get().isClosed())...{ tl.set(ds.getConnection()); } return tl.get(); } public static void close()throws SQLException...{ tl.get().close(); tl.set(null); } } 每次调用getConnection()获取连接,这样就实现一个线程一个连接。当业务方法都完成的时候调用这个类close方法把Connection放回池中。一个线程享用玩一个连接后,才把连接放回池中,节省了多次从池中放取连接的开销