- 浏览: 1524637 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
d
转自:来源忘记了。
/** * JavaGGDataSource.java 2011-3-4 上午09:21:05 */ package test.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; import javax.sql.DataSource; /** * @author linzq * */ public class JavaGGDataSource implements DataSource { // 连接队列 private ConcurrentLinkedQueue<_Connection> connQueue = new ConcurrentLinkedQueue<_Connection>(); // 存放所有连接容器 private List<_Connection> conns = new ArrayList<_Connection>(); private Driver driver = null; private String jdbcUrl = null; private String user = null; private String password = null; // -1为不限制连接数 private int maxActive = -1; private String driverClass = null; // 默认为4小时,即4小时没有任何sql操作就把所有连接重新建立连接 private int timeout = 1000 * 60 * 60 * 4; private AtomicLong lastCheckout = new AtomicLong( System .currentTimeMillis()); private AtomicInteger connCount = new AtomicInteger(); // 线程锁,主要用于新建连接和清空连接时 private ReentrantLock lock = new ReentrantLock(); public void closeAllConnection() { } /** * * 归还连接给连接池 * * * * @param conn * *@date 2009-8-13 * *@author eric.chan */ public void offerConnection(_Connection conn) { connQueue.offer(conn); } @Override public Connection getConnection() throws SQLException { return getConnection(user, password); } /** * * 从池中得到连接,如果池中没有连接,则建立新的sql连接 * * * * @param username * * @param password * * @author eric.chan */ @Override public Connection getConnection(String username, String password) throws SQLException { checkTimeout(); _Connection conn = connQueue.poll(); if (conn == null) { if (maxActive > 0 && connCount.get() >= maxActive) { for (;;) { // 采用自旋方法 从已满的池中得到一个连接 conn = connQueue.poll(); if (conn != null) break; else continue; } } lock.lock(); try { if (maxActive > 0 && connCount.get() >= maxActive) { // 处理并发问题 return getConnection(username, password); } Properties info = new Properties(); info.put("user", username); info.put("password", password); Connection conn1 = loadDriver().connect(jdbcUrl, info); conn = new _Connection(conn1, this); int c = connCount.incrementAndGet();// 当前连接数加1 conns.add(conn); System.out.println("info : init no. " + c + " connectioned"); } finally { lock.unlock(); } } lastCheckout.getAndSet(System.currentTimeMillis()); return conn.getConnection(); } /** * * 检查最后一次的连接时间 * * * * @throws SQLException * *@date 2009-8-13 * *@author eric.chan */ private void checkTimeout() throws SQLException { long now = System.currentTimeMillis(); long lt = lastCheckout.get(); if ((now - lt) > timeout) { _Connection conn = null; lock.lock(); try { if (connCount.get() == 0) return; while ((conn = connQueue.poll()) != null) { System.out.println("connection " + conn + " close "); conn.close(); conn = null; } for (_Connection con : conns) { con.close(); } conns.clear(); System.out.println("info : reset all connections"); // 重置连接数计数器 connCount.getAndSet(0); lastCheckout.getAndSet(System.currentTimeMillis()); } finally { lock.unlock(); } } } /** * * * * @return * *@date 2009-8-13 * *@author eric.chan */ private Driver loadDriver() { if (driver == null) { try { driver = (Driver) Class.forName(driverClass).newInstance(); } catch (ClassNotFoundException e) { System.out.println("error : can not find driver class " + driverClass); } catch (Exception e) { e.printStackTrace(); } } return driver; } @Override public PrintWriter getLogWriter() throws SQLException { return null; } @Override public int getLoginTimeout() throws SQLException { return 0; } @Override public void setLogWriter(PrintWriter out) throws SQLException { } @Override public void setLoginTimeout(int seconds) throws SQLException { } @Override public boolean isWrapperFor(Class iface) throws SQLException { throw new SQLException("no Implemented isWrapperFor method"); } @Override public <T> T unwrap(Class<T> iface) throws SQLException { throw new SQLException("no Implemented unwrap method"); } public String getJdbcUrl() { return jdbcUrl; } public void setJdbcUrl(String jdbcUrl) { this.jdbcUrl = jdbcUrl; } public String getUsername() { return user; } public void setUsername(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClass() { return driverClass; } public void setDriverClass(String driverClass) { this.driverClass = driverClass; } public int getTimeout() { return timeout; } public void setTimeout(int timeout) { this.timeout = timeout * 1000; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxActive() { return maxActive; } } /** * 数据连接的自封装 ,是java.sql.Connection的一个钩子,主要是处理close方法 * * @author linzq * */ class _Connection implements InvocationHandler { private final static String CLOSE_METHOD_NAME = "close"; private final Connection conn; private final JavaGGDataSource ds; _Connection(Connection conn, JavaGGDataSource ds) { this.conn = conn; this.ds = ds; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; // 判断是否调用了close的方法,如果调用close方法则把连接置为无用状态 if (CLOSE_METHOD_NAME.equals(method.getName())) { // 归还连接给连接池 ds.offerConnection(this); } else { // 运行非close的方法 obj = method.invoke(conn, args); } return obj; } public Connection getConnection() { // 返回数据库连接conn的接管类,以便截住close方法 Connection conn2 = (Connection) Proxy.newProxyInstance(conn.getClass() .getClassLoader(), new Class[] { Connection.class }, this); return conn2; } public void close() throws SQLException { // 调用真正的close方法,一但调用此方法就直接关闭连接 if (conn != null && !conn.isClosed()) conn.close(); } }
/** * TestGG.java 2011-3-4 上午10:02:14 */ package test.datasource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @author linzq * */ public class TestGG { /** * @param args */ public static void main(String[] args) { JavaGGDataSource ds = new JavaGGDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/test"); ds.setUsername("root"); ds.setPassword("123456"); ds.setTimeout(300); // ds.setMaxActive(60); for (int i = 0; i < 20; i++) { new GG(ds).start(); } } static class GG extends Thread { JavaGGDataSource ds = null; long l = System.currentTimeMillis(); public GG(JavaGGDataSource ds) { this.ds = ds; } static final String sql = "insert into testgg(col1,cols) values (?,?)"; static final String selectsql = "select * from testgg where id=?"; public void run() { for (int t = 0; t < 10000; t++) { Connection conn = null; try { conn = ds.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); // 以下为insert ps.setInt(1, 133664); ps.setString(2, "ddd"); ps.executeUpdate(); ResultSet rs = ps.getGeneratedKeys(); // 以下为select // 取得自增长ID ps = conn.prepareStatement(selectsql); if (rs.next()) { // System.out.println(rs); ps.setInt(1, rs.getInt("GENERATED_KEY"));// 表的字段名字也可以用字段下标值 } rs = ps.executeQuery(); while (rs.next()) { rs.getInt("id"); rs.getInt("col1"); } rs.close(); ps.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) { // ds.offerConnection(conn); conn.close(); } } catch (Exception e) { e.printStackTrace(); } } } System.out.println(System.currentTimeMillis() - l); } } }
数据库表结构:
CREATE TABLE `testgg` ( `id` int(11) NOT NULL auto_increment, `col1` int(11) default NULL, `cols` varchar(200) default NULL, PRIMARY KEY (`id`) )
d
发表评论
-
Java线程:线程状态的转换
2012-01-30 16:09 917转自:http://lavasoft.blog.51cto.c ... -
多个线程访问共享对象和数据的方式
2011-10-26 08:15 1140(1)如果每个线程执行的代码相同,可以使用同一个Runnabl ... -
线程同步通信
2011-10-22 19:48 860看传智播客张孝祥讲的一个例子。 子线程循环10次 ... -
Java threads may not use all your CPUs
2010-06-10 11:51 1048Enterprise-level applications o ... -
java.util.concurrent.CountDownLatch
2009-12-13 10:53 1884import java.util.concurrent. ... -
java.util.concurrent.Exchanger
2009-12-13 10:52 2922d import java.util.concurrent. ... -
java.util.concurrent.Semaphore
2009-12-11 22:25 2636http://zhidao.baidu.com/questio ... -
java.util.concurrent.CyclicBarrier
2009-12-11 11:46 4706在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且 ...
相关推荐
基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip
Linux课程设计.doc
课程考试资源描述 本资源是为应对各类课程考试而精心准备的综合性学习包。它包含了多门学科的考试指南、历年真题、模拟试题以及详细的答案解析。这些资源旨在帮助学生系统复习课程内容,理解考试要点,提高解题技巧,从而在考试中取得优异成绩。 资源中不仅包含了基础的考试资料,还特别加入了考试技巧讲解和备考策略分析。学生可以通过这些资源了解不同题型的解题方法和思路,学会如何在有限的时间内高效答题。此外,还有针对弱项科目和难点的专项训练,帮助学生攻克学习瓶颈。 为了确保资源的时效性和准确性,我们会定期更新考试资料和模拟试题,及时反映最新的考试动态和趋势。同时,也提供了在线交流平台,方便学生之间互相讨论、分享学习心得。 项目源码示例(简化版,Python) 以下是一个简单的Python脚本示例,用于生成包含选择题和答案的模拟试题: python import random # 定义选择题题库 questions = [ {"question": "Python的创始人是谁?", "options": ["A. 林纳斯·托瓦兹", "B. 巴纳姆", "C. 比尔·盖茨", "D.
基于 MySQL+Django 实现校园食堂点餐系统。 主要环境: PowerDesigner MySQL Workbench 8.0 CE Python 3.8 Django 3.2.8 BootStrap 3.3.7 Django-simpleui
基于SpringBoot的同城宠物照看系统源码数据库文档.zip
GEE训练教程
基于springboot+Web的心理健康交流系统源码数据库文档.zip
微信小程序 kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip
N32G45X运放电路检测电压
梦幻西游道人是梦幻西游里面的一个NPC,主要是刷全服最实惠的高级兽决和其他很好用的比较贵的东西,在长安城、傲来国、长寿村中的任意一个场景出现,一般会出现30分钟,不过东西一般都被秒刷。 梦幻西游道人出现时间解析如下: 1.梦幻西游道人出现时间一直都保持着一年出现两次的规律,即2、3月份的元宵节期间来一次,9月份的教师节期间出现一次。 2.云游道人每个整点(0:00至7:00不出现)会在长安城、傲来国、长寿村中的任意一个场景出现,每次出现后停留时间为30分钟。
tables-3.7.0-cp38-cp38-win_amd64.whl
基于springboot旧物回收管理系统源码数据库文档.zip
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 本文档介绍了MariaDB 10.1的集群部署,至少三台机器做成集群,每台可以同时提供读和写,感兴趣的小伙伴们可以参考一下
内容概要:本文档全面介绍了JavaScript作为一种轻量级的、解释型的语言及其在前端开发中的广泛应用。从JavaScript的基本概念出发,详尽讲解了基础语法(如变量、数据类型、运算符、流程控制)、函数和闭包、对象和原型、DOM操作(如获取、修改、添加和删除元素)、事件处理(如事件监听器、事件对象)、AJAX与Fetch API、ES6+的新特性(如箭头函数、模板字符串、解构赋值)以及前端框架和库(React、Vue、Angular)。除此之外,文章还涉及了代码优化技巧(如减少DOM操作、选择适当的算法和数据结构、使用工具提升代码性能),并对JavaScript的应用场景和发展趋势进行了展望。 适用人群:适用于初学者或具有少量编程经验的学习者,旨在帮助他们系统掌握JavaScript基础知识和前沿技术。 使用场景及目标:通过本教程的学习,读者不仅可以学会基本语法,还能理解并掌握高级概念和技术,如DOM操纵、事件处理机制、异步编程及最新的ECMAScript规范。这不仅有助于改善用户体验、增强网站互动性和响应速度,也能有效提升自身的编码水平和项目开发能力。 其他说明:此文档不仅涵盖了JavaScript的传统功能,还有现代前端技术和最佳实践指导,确保读者能够紧跟行业发展步伐,成为合格甚至优秀的Web开发人员。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
基于springboot高考志愿智能推荐系统源码数据库文档.zip
经典-FPGA时序约束教程
mcu交互实验整体文件
Collins COBUILD (CN).mdx
自定义springboot starter