文档章节

postgresql jdbc 了解postgresql数据库对jdbc的参数设置

harris2016
 harris2016
发布于 2016/06/15 10:05
字数 863
阅读 69
收藏 0

  postgresql jdbc 连接到postgresql 数据库时,postgresql数据库会返回一些参数来设置jdbc。postgresql 是通过发送类型为S的数据包给客户端的。本文主要讲解jdbc中针对哪些参数进行了使用。

  通过搜索jdbc的源码,可以找到只有三个函数中针对参数进行了处理,这三个函数分别为:readStartupMessages,processCopyResults,processResults。第一个函数是处理建立连接时的数据包的。第二个参数从名字看应该是处理copy功能时的函数。第三个参数处理的大部分操作的数据包。

    在这三个函数中,readStartupMessages函数处理的参数分别为:server_version_num,client_encoding,standard_conforming_strings,integer_datetimes。processCopyResults和processResults函数中只处理了client_encoding,DateStyle,standard_conforming_strings这三个参数,其他的参数都被忽略掉了。

    但是从9.4的postgresql数据库的通信看,传递了很多参数给客户端,下面是通过jdbc的调试功能得到的数据库端设置jdbc端的参数情况:

<=BE ParameterStatus(application_name = )
<=BE ParameterStatus(client_encoding = UTF8)
<=BE ParameterStatus(DateStyle = ISO, YMD)
<=BE ParameterStatus(integer_datetimes = on)
<=BE ParameterStatus(IntervalStyle = postgres)
<=BE ParameterStatus(is_superuser = on)
<=BE ParameterStatus(server_encoding = UTF8)
<=BE ParameterStatus(server_version = 9.4.4)
<=BE ParameterStatus(session_authorization = db_user)
<=BE ParameterStatus(standard_conforming_strings = on)
<=BE ParameterStatus(TimeZone = Asia/Shanghai)
<=BE BackendKeyData(pid=22833,ckey=1140395019)

上面参数中integer_datetimes如果为on,则代表日期可以使用double类型来进行通信。standard_conforming_strings则是针对字符串的处理的设置。如果为on,则不把\当做转义。

下面是上述三个函数的详细代码:

readStartupMessages

case 'S':
	// ParameterStatus
	int l_len = pgStream.ReceiveInteger4();
	String name = pgStream.ReceiveString();
	String value = pgStream.ReceiveString();
	
	if (logger.logDebug())
	    logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");
	
	if (name.equals("server_version_num"))
	    protoConnection.setServerVersionNum(Integer.parseInt(value));
	if (name.equals("server_version"))
	    protoConnection.setServerVersion(value);
	else if (name.equals("client_encoding"))
	{
	    if (!value.equals("UTF8"))
	        throw new PSQLException(GT.tr("Protocol error.  Session setup failed."), PSQLState.PROTOCOL_VIOLATION);
	    pgStream.setEncoding(Encoding.getDatabaseEncoding("UTF8"));
	}
	else if (name.equals("standard_conforming_strings"))
	{
	    if (value.equals("on"))
	        protoConnection.setStandardConformingStrings(true);
	    else if (value.equals("off"))
	        protoConnection.setStandardConformingStrings(false);
	    else
	        throw new PSQLException(GT.tr("Protocol error.  Session setup failed."), PSQLState.PROTOCOL_VIOLATION);
	}
	else if (name.equals("integer_datetimes"))
	{
	    if (value.equals("on"))
	        protoConnection.setIntegerDateTimes(true);
	    else if (value.equals("off"))
	        protoConnection.setIntegerDateTimes(false);
	    else
	        throw new PSQLException(GT.tr("Protocol error.  Session setup failed."), PSQLState.PROTOCOL_VIOLATION);
	}
	
	break;

processCopyResults:

case 'S':    // Parameter Status
{
    int l_len = pgStream.ReceiveInteger4();
    String name = pgStream.ReceiveString();
    String value = pgStream.ReceiveString();
    if (logger.logDebug())
        logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");

    if (name.equals("client_encoding") && !value.equalsIgnoreCase("UTF8") && !allowEncodingChanges)
    {
        protoConnection.close(); // we're screwed now; we can't trust any subsequent string.
        error = new PSQLException(GT.tr("The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.", value), PSQLState.CONNECTION_FAILURE);
        endReceiving = true;
    }

    if (name.equals("DateStyle") && !value.startsWith("ISO,"))
    {
        protoConnection.close(); // we're screwed now; we can't trust any subsequent date.
        error = new PSQLException(GT.tr("The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.", value), PSQLState.CONNECTION_FAILURE);
        endReceiving = true;
    }
    
    if (name.equals("standard_conforming_strings"))
    {
        if (value.equals("on"))
            protoConnection.setStandardConformingStrings(true);
        else if (value.equals("off"))
            protoConnection.setStandardConformingStrings(false);
        else
        {
            protoConnection.close(); // we're screwed now; we don't know how to escape string literals
            error = new PSQLException(GT.tr("The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.", value), PSQLState.CONNECTION_FAILURE);
            endReceiving = true;
        }
    }
}

processResults

case 'S':    // Parameter Status
  {
      int l_len = pgStream.ReceiveInteger4();
      String name = pgStream.ReceiveString();
      String value = pgStream.ReceiveString();
      if (logger.logDebug())
          logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");

      if (name.equals("client_encoding") && !value.equalsIgnoreCase("UTF8") && !allowEncodingChanges)
      {
          protoConnection.close(); // we're screwed now; we can't trust any subsequent string.
          handler.handleError(new PSQLException(GT.tr("The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.", value), PSQLState.CONNECTION_FAILURE));
          endQuery = true;
      }

      if (name.equals("DateStyle") && !value.startsWith("ISO,"))
      {
          protoConnection.close(); // we're screwed now; we can't trust any subsequent date.
          handler.handleError(new PSQLException(GT.tr("The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.", value), PSQLState.CONNECTION_FAILURE));
          endQuery = true;
      }
      
      if (name.equals("standard_conforming_strings"))
      {
          if (value.equals("on"))
              protoConnection.setStandardConformingStrings(true);
          else if (value.equals("off"))
              protoConnection.setStandardConformingStrings(false);
          else
          {
              protoConnection.close(); // we're screwed now; we don't know how to escape string literals
              handler.handleError(new PSQLException(GT.tr("The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.", value), PSQLState.CONNECTION_FAILURE));
              endQuery = true;
          }
      }
  }

 

© 著作权归作者所有

共有 人打赏支持
harris2016
粉丝 10
博文 53
码字总数 30227
作品 0
杭州
程序员
PostgreSQL jdbc 错误代码映射(SQLSTATE)

标签 PostgreSQL , SQLSTATE , 错误代码 , org.postgresql.util.PSQLState 背景 Does such a class enumerating the PostgreSQL error codes already exist? Yes, it does: org.postgresql.u......

德哥
10/05
0
0
JAVA存取PostgreSQL二进制类型bytea

经过测试:JAVA存取PostgreSQL的bytea类型均存在内存的限制问题(存取的数据过大会出现out of memory内存溢出的问题),EnterpriseDB对此做了优化。 取PostgreSQL中的bytea,并存储到硬盘上....

YuanyuanL
2013/08/09
0
0
多平台向Postgresql 迁移

最近有个工作要把 一个SqlServer 迁移到 Postgresql 平台上,上网搜了搜,EnterpriseDB在这块做了很多工作, EnterpriseDB 的 Postgres Plus Advanced Server管理工具中有一个 mogiration t...

从前
2013/01/30
0
0
PostgreSQL 登陆登出(login logout)事件触发方法

标签 PostgreSQL , 事件触发器 , event trigger , hook , login hook , libpq 背景 PostgreSQL 支持event trigger,但是event局限于DDL。当发生DDL时,可以触发一些动作调用用户自定义的eve...

德哥
09/15
0
0
postgresql数据库连接池pgbouncer

前端时间看了看服务器还有多余的内存,由于数据库和程序都在一个服务器上,就想看看有什么提升并发的方法。试用了下pgbouncer ,记录下。 1.源码安装: wget https://github.com/downloads/...

从前
2013/06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Snackbar源码分析

目录介绍 1.最简单创造方法 1.1 Snackbar作用 1.2 最简单的创建 1.3 Snackbar消失的几种方式 2.源码分析 2.1 Snackbar的make方法源码分析 2.2 对Snackbar属性进行设置 2.3 Snackbar的show显示...

潇湘剑雨
34分钟前
1
0
分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储 摘要: 原创出处 http://www.iocoder.cn/Elastic-Job/job-storage/ 本文基于 Elastic-Job V2.1.5 版本分享 1. 概述 本文主要分享...

DemonsI
40分钟前
1
0
jmockit demo

1、@Mocked,标识一个指定的class的实例或被测对象的参数被Mock掉。 2、@Capturing,标识一个被Mock的对象,从该对象派生的子类也被Mock了。 3、@Injectable,标识只有一个指定的被测对象的内...

我的老腰啊
54分钟前
1
0
内容换行

用 <textarea>13611112222 这里想换行 13877779999</textarea><textarea>13611112222 13877779999</textarea>...

小黄狗
55分钟前
1
0
学习设计模式——单例模式

1. 认识单例模式 1. 定义:一个类中仅有一个实例,并提供一个访问它的全局访问点。 2. 结构:仅一个Singleton类,其中包含一个static类变量,而类变量的类型就是Singleton类,而且Singleton...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部