精华内容
下载资源
问答
  • connection
    千次阅读
    2021-02-28 10:34:23

    java.sql

    接口 Connection

    public interface Connection

    与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

    Connection 对象的数据库能够提供信息描述其表、所支持的 SQL 语法、存储过程和此连接的功能等。此信息是使用 getMetaData 方法获得的。

    注:默认情况下,Connection 对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。如果禁用自动提交模式,为了提交更改,必须显式调用 commit 方法;否则无法保存数据库更改。

    使用 JDBC 2.1 核心 API 创建的 Connection 对象有一个与之关联的最初为空的类型映射表。用户可以为此类型映射表中的 UDT 输入一个自定义映射关系。在使用 ResultSet.getObject 方法从数据源中检索 UDT 时,getObject 方法将检查该连接的类型映射表,以查看是否有对应该 UDT 的项。如果有,那么 getObject 方法会将该 UDT 映射到所指示的类。如果没有项,则会使用标准映射关系映射该 UDT。

    用户可以创建一个新的类型映射表,该映射表是一个 java.util.Map 对象,可在其中创建一个项,并将该项传递给可以执行自定义映射关系的 java.sql 方法。在这种情况下,该方法将使用给定的类型映射表,而不是与连接相关联的映射表。

    取消

    评论

    更多相关内容
  • JdbcConnection

    千次下载 热门讨论 2016-06-23 11:28:25
    JdbcConnection 项目通过jsp+servlet+tomcat+mysql实现了对数据库的增删改查等功能,
  • 在使用封装的通用操作数据库方法里,存在获取数据库连接对象的操作,从而导致每次有sql语句调用此通用方法时都会获得一个不同的数据库连接对象,导致这些sql语句不能组成事务(因为Connection的setAutoCommit()方法...

    在使用封装的通用操作数据库方法里,存在获取数据库连接对象的操作,从而导致每次有sql语句调用此通用方法时都会获得一个不同的数据库连接对象,导致这些sql语句不能组成事务(因为Connection的setAutoCommit()方法是针对Connection对象生效的)所以会导致下面的情况:两条sql”组成了表面上的事务“,但其中一条出错后也不能回滚,一个账户减了500元,另一个账户没有加上。

    public class GetDifferentConnection {
        public static Connection getConnection() throws Exception {
            Properties properties = new Properties();
            properties.load(new FileInputStream(new File("D:\\develop\\IdeaProject\\SGG\\day28\\src\\BasicDAO\\druid.properties")));
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            Connection connection = dataSource.getConnection();
            return connection;
        }
        public static void update(String sql, Object... args) throws Exception {
            Connection conn = getConnection();
            System.out.println(conn);
            PreparedStatement pst = conn.prepareStatement(sql);
            if (args != null && args.length > 0) {
                for (int i = 0; i < args.length; i++) {
                    pst.setObject(i + 1, args[i]);
                }
            }
            //开始进行事务处理
            conn.setAutoCommit(false);
            try {
                pst.executeUpdate();
                conn.commit();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                conn.rollback();
            } finally {
                pst.close();
            }
        }
    }
    class Demo2 {
        public static void main(String[] args) throws Exception {
            String sql1 = "UPDATE acccount SET balance = balance -500 WHERE id=1;";
            String sql2 = "UPDATE acccount SET balance = balance +500 WHARE id=2;";
            GetDifferentConnection.update(sql1);//com.mysql.jdbc.JDBC4Connection@6385cb26
            GetDifferentConnection.update(sql2);//com.mysql.jdbc.JDBC4Connection@c8e4bb0
            //每执行一次update()方法,都会执行一次getConnection()方法,导致两次的Connection对象是两个不同的,
            // 并且事务处理时的setAutoCommit(false)方法,只针对调用此方法的Connection对象,
            //所以,com.mysql.jdbc.JDBC4Connection@6385cb26执行成功,com.mysql.jdbc.JDBC4Connection@c8e4bb0执行失败,
            //失败的这个确实会回滚,但由于成功的com.mysql.jdbc.JDBC4Connection@6385cb26与失败的com.mysql.jdbc.JDBC4Connection@c8e4bb0不是同一个对象,
            //所以这两个不同的连接对象不能构成一个事务,所以失败的回滚自己不会影响成功的修改数据
        }
    }
    
    

    数据库原始状态
    执行了错误的事务代码之后的状态
    执行了错误的事务代码之后的控制台输出

    首先使用静态成员数组的方式进行修改,以方便更了解后面使用ThreadLocal的方式。因为这两个方式类似。

    原理:每次调用getConnection()获取数据库连接对象时都要判断静态数组里是不是有了一个了,如果有了就不再创建新的,保证了多次执行update()方法时仅有一个数据库连接对象

    public class GetSameConnection {
        //创建一个保存一个Connection对象的静态数组
        static Connection[] connections = new Connection[1];
    
        public static void getConnection() throws Exception {
            Properties properties = new Properties();
            properties.load(new FileInputStream(new File("D:\\develop\\IdeaProject\\SGG\\day28\\src\\BasicDAO\\druid.properties")));
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            //每次调用getConnection()获取数据库连接对象时都要判断静态数组里是不是有了一个了,如果有了就不再创建新的,保证了多次执行update()方法时仅有一个数据库连接对象
            if (connections[0] == null) {
                connections[0] = dataSource.getConnection();
            }
        }
    
        public static void update(String sql, Object... args) throws Exception {
            getConnection();
            Connection conn = connections[0];
            System.out.println(conn);
            PreparedStatement pst = conn.prepareStatement(sql);
            if (args != null && args.length > 0) {
                for (int i = 0; i < args.length; i++) {
                    pst.setObject(i + 1, args[i]);
                }
            }
            conn.setAutoCommit(false);
            try {
                pst.executeUpdate();
                conn.commit();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                conn.rollback();
            } finally {
                pst.close();
            }
        }
    }
    
    class Demo3 {
        public static void main(String[] args) throws Exception {
            String sql1 = "UPDATE acccount SET balance = balance -500 WHERE id=1;";//com.mysql.jdbc.JDBC4Connection@6385cb26
            String sql2 = "UPDATE acccount SET balance = balance +500 WHARE id=2;";//com.mysql.jdbc.JDBC4Connection@6385cb26
            GetSameConnection.update(sql1);
            GetSameConnection.update(sql2);
        }
    }
    
    

    静态数组方式的控制台

    接下来就是使用ThreadLocal的方式

    使用ThreadLocal可以存储每个线程的备份资源,因为都是main线程去执行update方法,也当然是只有一个main线程进入到了getConnection方法,所以该类里的ThreadLocal对象也是唯一不变的。

    第一次执行getConnection时,main线程的ThreadLocal中没有Connection对象,则会使用set方法给装入一个Connection对象。之后每次执行getConnection时,由于main线程的ThreadLocal中存在Connection对象了,就不会再set了,保证了多次执行getConnection方法都只有一个不变的数据库连接对象

    public class GetConnectionThreadLocal {
        static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
        //使用ThreadLocal可以存储每个线程的备份资源,因为都是main线程去执行update方法,
        //也当然是只有一个main线程进入到了getConnection方法,所以该类里的ThreadLocal对象也是唯一不变的
        //第一次执行getConnection时,main线程的ThreadLocal中没有Connection对象,则会使用set方法给装入一个Connection对象
        //之后每次执行getConnection时,由于main线程的ThreadLocal中存在Connection对象了,就不会再set了,保证了多次执行getConnection方法都只有一个不变的数据库连接对象
        public static void getConnection() throws Exception {
            Properties properties = new Properties();
            properties.load(new FileInputStream(new File("D:\\develop\\IdeaProject\\SGG\\day28\\src\\BasicDAO\\druid.properties")));
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            if (threadLocal.get() == null) {
                Connection connection = dataSource.getConnection();
                threadLocal.set(connection);
            }
        }
        public static void update(String sql, Object... args) throws Exception {
            getConnection();
            Connection conn = threadLocal.get();
            System.out.println(conn);
            PreparedStatement pst = conn.prepareStatement(sql);
            if (args != null && args.length > 0) {
                for (int i = 0; i < args.length; i++) {
                    pst.setObject(i + 1, args[i]);
                }
            }
            conn.setAutoCommit(false);
            try {
                pst.executeUpdate();
                conn.commit();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                conn.rollback();
            } finally {
                pst.close();
            }
        }
    }
    class Demo {
        public static void main(String[] args) throws Exception {
            String sql1 = "UPDATE acccount SET balance = balance -500 WHERE id=1;";
            String sql2 = "UPDATE acccount SET balance = balance +500 WHERE id=2;";
            GetSameConnection.update(sql1);
            GetSameConnection.update(sql2);
        }
    }
    
    

    ThreadLocal方式的控制台

    展开全文
  • Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 127.0.0.1, port 1433 has failed. Error: "Connection timed out: ...

    Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 127.0.0.1, port 1433 has failed. Error: "Connection timed out: no further information.. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".

    目录

     (1)打开SQL Server 2019配置管理器

     ​(2)将TCP/IP禁用状态改为已启用状态​

     (3)重启SQL Server(MSSQLSERVER)服务


    (1)打开SQL Server 2019配置管理器

    位置:开始–>Microsoct SQL Server 2019–>SQL Server 2019配置管理器

    如果你不是用的2019版本,找到与自己安装的版本号相同的即可。

    (2)将TCP/IP禁用状态改为已启用状态

    sqlServer默认端口是1433,没有特别要求可以不用修改端口号。 

     

     (3)重启SQL Server(MSSQLSERVER)服务

    首先通过cmd输入命令services.msc

     

     

    展开全文
  • 诡异的Connection reset

    万次阅读 2021-03-25 20:30:35
    开发反馈测试环境A应用通过httpclient连接B应用,偶发java.net.socketException: connection reset报错。 理解 Connection reset: 在我看来 Connection reset分为2种情况: 第一种Connection reset by peer: ...

    场景:

    开发反馈测试环境A应用通过httpclient连接B应用,偶发java.net.socketException: connection reset报错。

    理解 Connection reset:

    在我看来 Connection reset分为2种情况:

    第一种Connection reset by peer:

          服务器返回了RST时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示"Connection reset by peer"。

    第二种java.net.socketException: connection reset:

         服务器返回了RST时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset";

    那么不管那种情况 其实都是服务器返回了RST标志位,但是客户端还在进行输入输出数据,

    通过以上描述,猜测Connection reset的原因是客户端连接保活机制超时回收连接,但是服务端还在使用该连接池导致报错。

    排查过程:

    首先肯定是自己去模拟错误,但是这个模拟错误代价有点大,毕竟是偶发现象。连续访问几十次都没模拟出问题。之后我只能放弃挣扎去看两个应用的相关日志 看能不能找到一点猫腻,比如在这里我会根据traceid跟踪整条链路,但是几乎没什么收获。之后配合开发将连接地址改成直连,这里说一下我这环境是k8环境。 然后直连模拟了大概一天。并没有出现connection reset。

    那么问题肯定是出在连接svc地址的时候出现了connection reset问题。

    目前该环境用的模式是ipvs,那么众所周知的是ipvs是有超时时间的,如果超时的话,连接将被回收。那么我们可以看下这个环境的配置

    所以说,7200是两个小时,明显大于15分钟。本来预期的2小时的tcp链接,15分钟就被kill掉了。

    为了验证这个问题,多次等待15分钟访问该接口,终于功夫不负有心人,15分钟必现,那么就不存在偶然的说法了。

    之后围绕这个问题开始了一系列的操作。

    为了达到 ipvs timeout > docker 中 net.ipv4.tcp_keep_alive

    解决这个问题:

    1.增大 ipvs timeout

    ipvsadm --set 7500 120 300

    2.缩小net.ipv4.tcp_keep_alive = 600

    在主机上修改/etc/sysctl.conf 将 tcp_keep_alive 改为600 并且同时需要修改k8s pod的tcp_keep_alive 并且kubelet需要增加--allowed-unsafe-sysctls=net.*
    securityContext:
    sysctls:
    - name: net.ipv4.tcp_keepalive_probes
      value: "10"
    - name: net.ipv4.tcp_keepalive_intvl
      value: "30"
    - name: net.ipv4.tcp_keepalive_time
      value: "600"

    这边解释一下原理,k8s同一个集群的两个pod直接通过svc cluster ip 访问,通过cluster ip 访问的微服务,流量会经过kube-proxy,kube-proxy底层走的是ipvs,ipvs timeout 默认超时时间15分钟。过了15分钟,ipvs就会销毁tcp链接。

    在容器A中,通过netstat -altpn --timers 命令检查tcp链接,发现之前的tcp通道没有关闭,10.215.10.117 是podip, 10.222.222.187:80 是服务B的service_ip:port

    在容器A中,用ss -nt 命令和 ipvsadm命令查看到,在请求结束后,服务A容器内该链接未断开,而主机上ipvs通道已经超时销毁。如下图 当保活时间到0的时候宿主机的连接就会消失。

    很奇怪的是以上配置结束之后 并没有解决问题。后续通过linux的 watch机制 反复查看宿主机已经客户端的连接池的状态,发现当客户端建立连接的时候 连接池的状态一直处于off状态(没有时间计时)初步怀疑是客户端建立连接的时候没有打开保活机制导致。

    如果开启保活连接的话 会处于keepalive状态如图:

     当为 keepalive 时,表明 TCP 协议栈开启了 keep alive timers,后面括号中的值分别是 timer 所剩时长/重传次数/keepalive probe 次数。当为 off 时,表明没有开启 TCP keepalive timer。当然,正如前面所说,这个 timer 是否开启,和 HTTP keep alive 没有必然联系。

    宿主机:

    httpClient pod:

    所以按照httpclient 返回的timer status状态(off)来看并不是keepalived导致的,那么设置keepalived 的系统参数是没有用的。

    所以最终解决方案就是:

    第一种(4层tcp keepalived): 连接方式增加保活机制 必须搭配net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl 几个配置

    SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setSoTimeout(3600000).build(); //We need to set socket keep alive
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3600000).build();
            CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).
                                               setDefaultSocketConfig(socketConfig).build();
    HttpPost post = new HttpPost(url.toString());
    HttpResponse response = httpClient.execute(post);

     第二种(7层keepalived,目前我使用的方法):修改客户端的keepalive的策略keepAliveStrategy,当连接超时之后不再复用老连接。

    源代码:

    修改后的连接方式:

    展开全文
  • redis Connection refused 问题

    千次阅读 2022-04-22 10:20:32
    1. redis 远程连接被拒绝,redis.conf 默认配置文件中只有 127.0.0.1,添加redis服务器的ip地址即可,ifconfig查看: 在配置文件添加后,即可用该ip...用对外的ip搭建,否则远程连接在节点切换也会Connection refused
  • 之前一直是能用的,今天开机后突然出现Connection failed: Activation of network connection failed的问题,网络连接图标也变成了空心的“品”字形,中间三个小黑点。(忘截图了) 解决方案 先在ubuntu里尝试了sudo...
  • Connection reset原因分析及解决思路

    千次阅读 2022-02-09 11:04:33
    Connection reset原因分析及解决思路 - lwli - 博客园 我们在开发过程中经常会出现Connection reset问题,包括http调用,数据库连接等场景。出现Connection reset的原因很多,本文从tcp层面简单介绍下Connection ...
  • 在Android中,我們訪問網絡時,最簡單的方式類似與:HttpURLConnection connection = null;try {//xxxxx為具體的網絡地址URL url = new URL("xxxxx");connection = (HttpURLConnection) url.openConnection();...
  • 测试环境模拟: ... INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so'; Query OK, 0 rows affected (0.40 sec) mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS ...
  • 利用JDBC操作数据库的常用方法,首先加载数据库的驱动(Driver),获取数据库的连接对象(Connection),然后由连接对象创建操作数据库的语句对象(Statement),利用语句对象对数据库执行操作,得到结果集对象...
  • ConnectionError: (‘Connection aborted.’, error(104, ‘Connection reset by peer’)) 可能导致的有两个原因 1. 请求过于频繁, 导致请求被拒绝 解决方法: 每次请求设置一个休眠时间例如 time.sleep(1) 2. 接口...
  • ERR_CONNECTION_CLOSED

    千次阅读 2021-08-28 20:36:39
    ERR_CONNECTION_CLOSED 把宝塔的强制https关了。清理了cloudfare缓存,好像可以了
  • Apparent connection leak detected

    千次阅读 2021-01-26 18:48:30
    pool.all.log.2021012610.gz:java.lang.Exception: Apparent connection leak detected pool.all.log.2021012610.gz: at com.sq.driver.datasource.HikariDatasourceWrap.initDatasource(HikariDatasourceWrap.java:...
  • get connection timeout retry : 1

    千次阅读 2021-06-15 16:43:18
    错误一:get connection timeout retry : 1 https://github.com/alibaba/druid/issues/4326 生成环境运行一段时间后,报错如下: com.alibaba.druid.pool.DruidDataSource : get connection timeout retry : 1 ...
  • java中的Connection怎么用?

    千次阅读 2021-02-12 20:30:55
    展开全部Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是62616964757a686964616fe59b9ee7ad9431333365643534使用 getMetaData 方法获得的。注:在配置 ...
  • 标题:Client network socket disconnected before secure TLS connection was established 我在使用 SAP Spartacus 连接 Commerce Cloud 后台 OCC API 时,遇到如下错误消息: Error: Client network socket ...
  • Nginx: 104: Connection reset by peer 错误

    千次阅读 2021-05-10 17:51:04
    在这种情况下,调用write或send方法后,对端socket便会向本端socket发送一个RESET信号,在此之后如果继续执行write或send操作,就会得到errno为104,错误描述为connection reset by peer。 如果对方socket已经执行...
  • SelectConnection 定义如下: class SelectConnection(BaseConnection): def __init__( self, # pylint: disable=R0913 parameters=None, on_open_callback=None, ...
  • gradle调试一直报错 Connection refused: connect 其实就是新项目中的gradle与原始开发环境中的版本不匹配或者说没有对应版本资源 可以选择手动下载对应的版本资源存入本地路径 1)通过下载工具下载...
  • 解决 Connection refused: connect error

    万次阅读 2019-07-11 16:06:01
    Connection refused: connect error 异常如下: * What went wrong: Could not resolve all files for configuration ':utils:debugCompileClasspath'. > Could not download design.aar ...
  • ConnectionPool实现redis在python中的连接

    千次阅读 2019-07-03 17:24:00
    今天在写zabbix storm job监控脚本的时候用到了python的redis模块,之前也有用过,但是没有过多的了解,今天看了下相关的api和源码,看到有ConnectionPool的实现,这里简单说下。 在ConnectionPool之前,如果需要连.....
  • ConnectionResetError: [Errno 104] Connection reset by peer 问题解析 参见pytorch的issue I believe the issue is only triggered for the case that both persistent_workers and pin_memory are turned on ...
  • ERR_CONNECTION_REFUSED错误

    万次阅读 热门讨论 2021-07-30 11:10:56
    一:ERR_CONNECTION_REFUSED错误 该原因大部分是你服务器访问不支持https协议,怎么验证呢,比如访问:http://leyangjun.com域名如果可以正常访问,但是访问:https://leyangjun.com域名无法访问且浏览器放回ERR_...
  • Mybatis之Sqlsession、Connection和Transaction解析关系与原理 对于我们开发来讲,不管跟任何关系型数据库打交道都无法规避这三巨头,数据库的会话-Sqlsession、链接-Connection和事务-Transaction,今天让我们一...
  • elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='192.168.56.100', port=9200): Read timed out. (read timeout=10)) 2.原因分析 Elastic...
  • Github报错OpenSSL SSL_connect: Connection was reset in connection to github.com:443终极解决方案 今天在使用git命令进行push和pull时,出现如下报错: fatal: unable to access '...
  • HTTP Connection详解

    千次阅读 2020-08-18 09:40:18
    HTTP Connection详解 HTTP请求发送之前,需要先建立TCP连接,只有TCP连接建立,才可以发送HTTP请求。 ... 操作 ...在浏览器中,ConnectionID 表示的就是TCP建立连接的ID 以google浏览器为例子, 在常见网站中我们期望
  • 涉及的项目未开启
  • Opened connection [ connectionId { localValue : 1 , serverValue : 709 } ] to 172.16 .11 .47 : 27017 2019 - 10 - 29 20 : 25 : 20.020 INFO 26552 -- - [ .16 .11 .47 : 27017 ] org . ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,832,649
精华内容 733,059
关键字:

connection