数据库表池
A. 如何在NetBeans中设置数据库连接池
以往要设置数据库连接池,需要借助于第三方软件。但现在NetBeans所带的Tomcat 5.5.7及Sun Application Server 8均可以直接设置。下面谈谈如何在Tomcat 5.5.7下设置。
1. 下载数据库的专用连接驱动,并将其复制到C:Program Filesetbeans-4.1entERPrise1jakarta-tomcat-5.5.7commonlib文件夹下面。
假设所用数据库是Sybase的Adaptive Server Anywhere,从Sybase官方站点下载JConnect-6_0,从中抽取出jconn3这个驱动,复制到上述文件夹下。
2. 启动Tomcat,在IE输入http://localhost:8084/admin/,以管理员身份登录管理。用户登录的方法可参考第5楼。点击Resources下的Data Sources,在右边Data Source Actions的下拉框中选Create New Data Source,按下表示范填写:
JNDI Name: sybase/poolDB /* 根据喜好填 */
Data Source URL: JDBC:sybase:Tds:<localhost>:<端口号>
/* 数据库的地址,此为jconn3的形式,端口号需查询确认,但一般都是固定的,除非自己更改 */
JDBC Driver Class: com.sybase.jdbc3.jdbc.SybDriver /* jconn3的驱动 */
User Name: dba/* 用户名,默认为dba */
Password: *** /* 密码,默认为sql */
Max. Active Connections: 4/* 最大活动连接数 */
Max. Ide Connections: 2 /* 最大空闲连接数 */
Max. Wait for Connecton: 5000 /* 等待连接的最大秒数 */
Validation Query: /* 验证字符串,可不填 */
按"Save",再按"Commit Changes",Tomcat在后台将此变化保存到server.XML文件中。"Commit Changes"是最容易忘记的,小心。
3. 以下均转入NetBeans环境中设置。在context.xml修改的内容:
<Context path="/Matrix">
<ResourceLink global="sybase/poolDB" name="sybase/poolDB" type="javax.sql.DataSource"/>
</Context>
"/Matrix"为此Web应用的根地址,表现为http://localhost:8084/Matrix。
4. 在web.xml中加入:
<resource-ref>
<description>Sybase Database Connection Pool</description>
<res-ref-name>sybase/poolDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
5. 好了,可以使用连接池了。以下代码为在JSP文件中使用JSTL标签库的范例。
<sql:query var="queryresults" dataSource="sybase/poolDB">
SELECT * FROM customer
</sql:query>
B. Mysql数据库InnoDB缓冲池(Buffer Pool)
1.InnoDB缓冲池简介 InnoDB在内存中维护一个叫做缓冲池的存储区域来缓存数据和索引。了解InnoDB缓冲区如何工作,如何利用它来在内存中保存被频繁访问的数据,对Mysql调优至关重要。可以通过对InnoDB缓冲的各方面进行配置来改善Mysql的性能。理想情况下,可以将缓冲池设置为实际需要的值,为服务器上运行的其他进程保留足够内存以防发生过度交换。缓冲池越大,InnoDB就越像一个内存库,从磁盘上读取一次数据,后续只从内存中读取数据。大内存64位系统,可以把缓冲池分为多个部分,以便最小化并发操作时对内存结构的冲突。尽管会突然增加类似备份或报表类的活动,但依然可以将频繁访问的数据保存在内存中。预期不久将需要某些数据页,则可以控制InnoDB将数据页预先异步读入缓冲池的时间和方式。可以控制后台进程何时将脏页刷出到磁盘,以及InnoDB是否基于工作负载动态调整刷出脏页的频率。可以配置InnoDB保留当前的缓冲池状态,以避免服务器重启后发生过长的温启动时间。也可以在服务器运行时保存当前的缓冲池状态。
2.Innodb缓冲池LRU算法 Innodb将缓冲池作为链表并通过最近最少使用(LRU)的变种算法进行管理。当需要为缓冲池增加新页时,InnoDB对最近最少使用的页进行驱逐,并将新页增加到链表的中部。这种“中间点插入策略”将链表看做两个子链表:链表头部为最近被存取过的“新”(或“年轻”)页的子链表,链表尾部为最近较少被存取的“旧”页的子链表。这个算法把经常被查询使用的页保持在新的子链表中。旧的子链表则包含较少用到的页;这些页是将来被驱逐的候选页。LRU算法默认操作如下:缓冲池的3/8用作旧的子链表。链表中点是新的子链表尾部与旧的子链表头部衔接的边界。当InnoDB往缓冲池读入一个页时,会将该页插入到链表的中点(旧的子链表的头部)。当用户进行类似查询的特定操作需要数据页或InnoDB进行预读操作时,InnoDB会将其读入缓冲池。存取旧的子链表中的页会使其变得“年轻”,因为会将其移向缓冲池的头部(新的子链表的头部)。如果因为需要而将一个页读入缓冲池,则立即发生首次读取并使其变得年轻。如果因为预读而将一个页读入缓冲池,则并不立即发生首次存取(也许在该页被驱逐前根本就不会被读取)。随着数据库操作的进行,缓冲池中未被存取的页通过移向链表尾部而变老。其他也变新的同时,新旧子链表中的页变老。随着页被插入链表中点,旧子链表中的页也会变老。最终,长时间未被使用的页会到达旧子链表尾部而被驱逐。默认的,查询读取的页会立即移到新子链表,这意味着它们将会更长时间留在缓冲池中。表扫描(像mysqlmp操作或没有where子句的select语句引发的)能将大量数据带入缓冲池,并驱逐同等数量的旧数据,即使新数据还从未用过。类似的,被后台进程预读加载的页,接着仅被存取一次就移到新链表的头部。这些情况会频繁的将被用过的页推到旧子链表,从而将被驱逐。InnoDB标准监视输出在属于缓冲池LRU算法的BUFFER POOL AND MEMORY部分包含几个域。
3.InnoDB缓冲池配置选项 有几个配置选项会影响InnoDB缓冲池的不同方面。innodb_buffer_pool_size:确定缓冲池的大小。innodb_buffer_pool_chunk_size:定义InnoDB缓冲池改变大小时的块(chunk)大小。innodb_buffer_pool_instances:将缓冲池分为用户指定数目的独立区,每个有自己的LRU链表和相关的数据结构,以减少并发内存读写期间的冲突。innodb_old_blocks_pct:为用作旧子链表的缓冲池指定一个近似比例。innodb_old_blocks_time:指定首次访问后插入旧子链表的页,至少在旧子链表停留多少毫秒才能被移入新子链表。innodb_read_ahead_threshold:控制InnoDB将页预读进缓冲池的线性预读的灵敏度。innodb_random_read_ahead:开启将页预读进缓冲池的随机预读技术。innodb_adaptive_flushing:确定是否基于工作负载动态调整缓冲池中脏页的刷出率。innodb_flush_neighbors:确定从缓冲池刷出页时是否也刷出同一个范围内的其他脏页。innodb_flushing_avg_loops:InnoDB保持先前计算的刷出状态快照的迭代次数,用于控制针对负载变化自适应刷出的反应速度。innodb_lru_scan_depth:影响缓冲池刷出操作的算法和试探法的一个参数。主要用于性能专家对I/O密集的负载进行调试。innodb_max_dirty_pages_pct:InnoDB尽力从缓冲中刷出数据以便脏页的百分比不超过该值。innodb_max_dirty_pages_pct_lwm:开启预刷出控制脏页率时表示脏页百分比的低水位线。innodb_buffer_pool_filename:指定一个用于保存innodb_buffer_pool_mp_at_shutdown或innodb_buffer_pool_mp_now产生的表空间ID和页ID列表的文件名。innodb_buffer_pool_mp_at_shutdown:为了缩短下次重启时温启动过程的耗时,指定mysql服务器关闭时是否记录缓冲池中缓冲的页。innodb_buffer_pool_load_at_startup:指定在mysql服务器启动时通过加载较早时间缓冲的相同页来自动进行缓冲池热身。innodb_buffer_pool_mp_now:立即记录缓冲池中缓冲的页。innodb_buffer_pool_load_now:通过加载一套数据页来立刻进行缓冲池热身,而非等待服务器重启。innodb_buffer_pool_mp_pct:指定每个缓冲池中读出和导出的最近被使用页的百分比。innodb_buffer_pool_load_abort:中断innodb_buffer_pool_load_at_startup或innodb_buffer_pool_load_now触发的缓冲池内容恢复进程。
C. Java数据库连接池的几种配置方法(以MySQL数
连接先建立一些连接,并且这些连接允许共享,因此这样就节省了每次连接的时间开销。Mysql数据库为例,连接池在Tomcat中的配置与使用。
1、创建数据库Student,表student
2、配置server.xml文件。Tomcat安装目录下conf中server.xml文件。
<GlobalNamingResources>
<Resource
name="jdbc/DBPool"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/student"
maxActive="3"
/>
</GlobalNamingResources>
name:指定连接池的名称
type:指定连接池的类,他负责连接池的事务处理
url:指定要连接的数据库
driverClassName:指定连接数据库使用的驱动程序
username:数据库用户名
password:数据库密码
maxWait:指定最大建立连接等待时间,如果超过此时间将接到异常
maxIdle:指定连接池中连接的最大空闲数
maxActive:指定连接池最大连接数
3、配置web.xml文件。
<web-app>
<resource-ref>
<description>mysql数据库连接池配置</description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
4、配置context.xml文件
与server.xml文件所在的位置相同。
<Context>
<ResourceLink
name="jdbc/DBPool"
type="javax.sql.DataSource"
global="jdbc/DBPool"
/>
</Context>
5、测试
DataSource pool = null;
Context env = null;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
env = (Context)new InitialContext().lookup("java:comp/env");
//检索指定的对象,返回此上下文的一个新实例
pool = (DataSource)env.lookup("jdbc/DBPool");
//获得数据库连接池
if(pool==null){out.printl("找不到指定的连接池!");}
con = pool.getConnection();
st = con.createStatement();
rs = st.executeQuery("select * from student");
}catch(Exception ex){out.printl(ne.toString());}