首先,利用连接池来进行数据库的连接,要明白连接池和数据源到底是什么?
连接池:是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
1、好处:
对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。
1.1 减少连接创建时间
虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。
1.2 简化的编程模式
当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术。
1.3 受控的资源使用
如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生。
注意,每个连到 GBase 的连接在客户端和服务器端都有花销(内存,CPU,上下文切换等等)。每个连接均会对应用程序和 GBase 服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。
连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。
2、实现方法
下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口:
public class DBConnectionPool implements TimerListener{
private int checkedOut;//已被分配出去的连接数
private ArrayList freeConnections = new ArrayList();//容器,空闲池,根据//创建时间顺序存放已创建但尚未分配出去的连接
private int minConn;//连接池里连接的最小数量
private int maxConn;//连接池里允许存在的最大连接数
private String name;//为这个连接池取个名字,方便管理
private String password;//连接数据库时需要的密码
private String url;//所要创建连接的数据库的地址
private String user;//连接数据库时需要的用户名
public Timer timer;//定时器
public DBConnectionPool(String name, String URL, String user, String
password, int maxConn)//公开的构造函数
public synchronized void freeConnection(Connection con) //使用完毕之后,//把连接返还给空闲池
public synchronized Connection getConnection(long timeout)//得到一个连接,//timeout是等待时间
public synchronized void release()//断开所有连接,释放占用的系统资源
private Connection newConnection()//新建一个数据库连接
public synchronized void TimerEvent() //定时器事件处理函数
}
public class DBConnectionManager {
static private DBConnectionManager instance;//连接池管理类的唯一实例
static private int clients;//客户数量
private ArrayList drivers = new ArrayList();//容器,存放数据库驱动程序
private HashMap pools = new HashMap ();//以name/value的形式存取连接池//对象的名字及连接池对象
static synchronized public DBConnectionManager getInstance()//如果唯一的//实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,创//建连接池管理类的唯一实例
private DBConnectionManager()//私有构造函数,在其中调用初始化函数init()
public void freeConnection(String name, Connection con)// 释放一个连接,//name是一个连接池对象的名字
public Connection getConnection(Stringname)//从名字为name的连接池对象//中得到一个连接
public Connection getConnection(Stringname, long time)//从名字为name
//的连接池对象中取得一个连接,time是等待时间
public synchronized void release()//释放所有资源
private void createPools(Properties props)//根据属性文件提供的信息,创建//一个或多个连接池
private void init()//初始化连接池管理类的唯一实例,由私有构造函数调用
private void loadDrivers(Properties props)//装载数据库驱动程序
}
数据源:是指数据库应用程序所使用的数据库或者数据库服务器。
属性:
1. databaseName String数据库名称,即数据库的SID。
2. dataSourceName String数据源接口实现类的名称。
3. description String 对数据源的描述。
4. networkProtocol String 和服务器通讯使用的网络协议名。
5. password String 用户登录密码。
6. portNumber数据库服务器使用的端口。
7. serverName String数据库服务器名称。
8. user String 用户登录名。
如果数据是水,数据库就是水库,数据源就是连接水库的管道,终端用户看到的数据集是管道里流出来的水
首先,新建一个maven项目,在pom.xml中加入下面这段代码:
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.9.v20180320</version>
<dependencies>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.8.11.2</version>
</dependency>
</dependencies>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<jettyXml> ${basedir}/src/main/resources/jetty-env.xml</jettyXml>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
</configuration>
</plugin>
</plugins>
</build>
这段代码意思是添加一个jetty插件,依赖sqlite数据库,然后在项目中目录中的src/main/resources下,新建一个jetty-env.xml文件。
这个文件中的内容是数据源的配置信息。
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd";>
<Configure>
<New id="dataSource" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/sampleDS</Arg>
<Arg>
<New class="org.sqlite.SQLiteDataSource">
<Set name = "url">jdbc:sqlite:data.sqlite</Set>
</New>
</Arg>
</New>
</Configure>
<Arg>jdbc/sampleDS</Arg> 意思是数据源的名字。
接下来就是最后一步,在应用程序中使用数据源,调用一下代码进行运行。使用lookup()查找JNDI数据源
Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("jdbc/sampleDS");
connection = ds.getConnection();
做完以上的几个步骤,就可以使用数据源进行数据库的连接了。