package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn
package tk.dong.connection.util; import java.io.IOException; import java.io.InputStream; 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.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.LinkedList; import java.util.Properties; import java.util.logging.Logger; import javax.sql.DataSource; //这是通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作 public class JdbcPoolProxy implements DataSource { // 创建连接池 private static LinkedList<Connection> connections = new LinkedList<Connection>(); static { // 获取properties的配置文件,并以流的方式存储 InputStream inputStream = JdbcPoolProxy.class.getClassLoader() .getResourceAsStream("jdbc.properties"); // 创建properties的属性处理对象 Properties properties = new Properties(); try { // 将属性文件载入 properties.load(inputStream); // 获取连接的驱动文件 Class.forName(properties.getProperty("driverClassName")); // 循环创建连接并放入连接池 for (int i = 0; i < 10; i++) { // 创建连接对象 final Connection conn = DriverManager.getConnection( properties.getProperty("url"), properties.getProperty("user"), properties.getProperty("pass")); // 将创建分连接对象添加到连接池 // 通过动态代理处理close的方法实现取出的连接对象返回连接池的效果 connections.add((Connection) Proxy.newProxyInstance( JdbcPoolProxy.class.getClassLoader(), new Class[] { Connection.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 判断当前执行的方法名是不是close时还执行自己的方法体 if (!method.getName().equals("close")) { // 执行目标方法 return method.invoke(conn, args); } // 如果是close方法 // 向连接池中添加连接对象 connections.add(conn); System.out.println("又一个连接用玩完了,返回个连接池,当前连接池有" + connections.size() + "个连接对象"); return null; } })); System.out.println("线连接池添加了一个链接对象,当前连接池有======" + connections.size() + "=====个连接对象"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public Connection getConnection() throws SQLException { // 声明连接对象 Connection conn = null; // 判断连接池中是否有连接对象 if (connections.size() > 0) { // 从连接池取出连接对象 conn = connections.removeFirst(); System.out.println("有一个连接对象被占用,连接池还有=========" + connections.size() + "个连接"); } return conn; } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } @Override public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO Auto-generated method stub return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return false; } }下面是测试代码
package tk.dong.connectionPool.test; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; import tk.dong.connection.util.JdbcPoolProxy; public class JdbcPoolProxyTest { @Test public void test() throws SQLException { // 创建连接池对象 JdbcPoolProxy jdbcPoolProxy = new JdbcPoolProxy(); // 从连接池中取出连接 jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); Connection conn = jdbcPoolProxy.getConnection(); conn.close(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); } }
下面是运行结果
线连接池添加了一个链接对象,当前连接池有======1=====个连接对象 线连接池添加了一个链接对象,当前连接池有======2=====个连接对象 线连接池添加了一个链接对象,当前连接池有======3=====个连接对象 线连接池添加了一个链接对象,当前连接池有======4=====个连接对象 线连接池添加了一个链接对象,当前连接池有======5=====个连接对象 线连接池添加了一个链接对象,当前连接池有======6=====个连接对象 线连接池添加了一个链接对象,当前连接池有======7=====个连接对象 线连接池添加了一个链接对象,当前连接池有======8=====个连接对象 线连接池添加了一个链接对象,当前连接池有======9=====个连接对象 线连接池添加了一个链接对象,当前连接池有======10=====个连接对象 有一个连接对象被占用,连接池还有=========9个连接 有一个连接对象被占用,连接池还有=========8个连接 有一个连接对象被占用,连接池还有=========7个连接 有一个连接对象被占用,连接池还有=========6个连接 有一个连接对象被占用,连接池还有=========5个连接 又一个连接用玩完了,返回个连接池,当前连接池有6个连接对象 有一个连接对象被占用,连接池还有=========5个连接 有一个连接对象被占用,连接池还有=========4个连接

您可以通过计算图像每秒更新的次数来衡量屏幕的刷新率。DRR 是 Windows 11 中包含的一项新功能,可帮助您节省电池寿命,同时仍提供更流畅的显示,但当它无法正常工作时也就不足为奇了。随着越来越多的制造商宣布计划停止生产 60Hz 显示器,具有更高刷新率的屏幕预计将变得更加普遍。这将导致更流畅的滚动和更好的游戏,但它会以减少电池寿命为代价。但是,此 OS 迭代中的动态刷新率功能是一个漂亮的附加功能,可以对您的整体体验产生重大影响。继续阅读,我们将讨论如果 Windows 11 的动态刷新率未

在iPhone上,Apple 的屏幕录制功能会录制您在屏幕上所做的事情的视频,如果您想捕捉游戏玩法、引导他人完成应用程序中的教程、演示错误或其他任何事情,这非常有用。在显示屏顶部有凹口的旧款 iPhone 上,该凹口在屏幕录制中不可见,这是应该的。但在带有 Dynamic Island 切口的较新 iPhone 上,例如 iPhone 14 Pro 和 iPhone 14 Pro Max,Dynamic Island 动画显示红色录制指示器,这导致切口在捕获的视频中可见。这可能会

在创建虚拟机时,系统会要求您选择磁盘类型,您可以选择固定磁盘或动态磁盘。如果您选择了固定磁盘,后来意识到需要动态磁盘,或者相反,该怎么办?好!你可以把一种转换成另一种。在这篇文章中,我们将看到如何将VirtualBox固定磁盘转换为动态磁盘,反之亦然。动态磁盘是一种虚拟硬盘,它最初具有较小的大小,随着您在虚拟机中存储数据,其大小会相应增长。动态磁盘在节省存储空间方面非常高效,因为它们只占用所需的主机存储空间。然而,随着磁盘容量的扩展,可能会稍微影响计算机的性能。固定磁盘和动态磁盘是虚拟机中常用的

如果要在Windows11中将动态磁盘转换为基本磁盘,则应首先创建备份,因为该过程将擦除其中的所有数据。为什么要在Windows11中将动态磁盘转换为基本磁盘?根据Microsoft,动态磁盘已从Windows中弃用,不再推荐使用。此外,Windows家庭版不支持动态磁盘,因此您将无法访问这些逻辑驱动器。如果要将更多磁盘合并到更大的卷中,建议使用基本磁盘或存储空间。在本文中,我们将向您展示如何在Windows11上将动态磁盘转换为基本磁盘如何在Windows11中将动态磁盘转换为基本磁盘?在开始

微软在Windows10中引入了快速访问,并在最近发布的Windows11操作系统中保留了该功能。快速访问取代了文件资源管理器中的收藏夹系统。这两个功能之间的核心区别之一是快速访问在其列表中添加了一个动态组件。一些文件夹永久显示,而其他文件夹则根据使用情况显示。固定文件夹显示有一个大头针图标,动态文件夹没有这样的图标。您可以在此处查看我的收藏夹和快速访问之间的比较,了解更多详细信息。快速访问比收藏夹更强大,但动态文件夹列表为其添加了混乱元素。可能会显示无用或不应在文件资源管理器中突出显示的文件

想象一下,您正在系统上寻找某些东西,但不确定要打开或选择哪个应用程序。这就是动态磁贴功能发挥作用的地方。任何支持的应用程序的动态磁贴都可以添加到桌面或Windows系统的开始菜单上,其磁贴经常变化。LiveTiles使应用程序小部件变得活跃起来,非常令人愉悦。不仅是为了它的外观,甚至是为了方便。假设您在系统上使用whatsapp或facebook应用程序,如果在应用程序图标上显示通知数量不是很方便吗?如果将任何此类受支持的应用程序添加为动态磁贴,则这是可能的。让我们看看如何在Windows

什么是 Windows 11 上的动态锁定?动态锁定是 Windows 11 的一项功能,可在连接的蓝牙设备(您的手机或可穿戴设备)超出范围时锁定您的计算机。即使您在离开时忘记使用 Windows 键 + L 快捷键,动态锁定功能也会自动锁定您的 PC。Dynamic Lock 使用任何带有蓝牙的连接设备,但最好使用电池电量和续航里程充足的设备,例如您的手机。一旦您的设备在 30 秒内无法触及,Windows 将自动锁定屏幕。将蓝牙设备与 Windows 11 配对要让一切正常运行,您需要先将

如何使用HTML、CSS和jQuery制作一个动态的图片轮播在网站设计和开发中,图片轮播是一个经常使用的功能,用于展示多张图片或广告横幅。通过HTML、CSS和jQuery的结合,我们可以实现一个动态的图片轮播效果,为网站增加活力和吸引力。本文将介绍如何使用HTML、CSS和jQuery制作一个简单的动态图片轮播,并提供具体的代码示例。第一步:设置HTML结


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境