文档章节

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

harris2016
 harris2016
发布于 2016/06/15 10:05
字数 863
阅读 128
收藏 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
博文 54
码字总数 30661
作品 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......

德哥
2018/10/05
0
0
修改了数据库连接 可是db类型依然是

# 使用的数据库类型,根据db.type的值,下面对应类型的数据库连接要配置正确 db.type = mysql #db.type = postgresql #db.type = oracle #db.type = sqlserver #db.type = db2 # 使用postgre...

施立
2016/09/20
800
3
ETL for Oracle to PostgreSQL 1 - Oracle Data Integrator (ODI)

标签 PostgreSQL , Oracle , ETL , Oracle Data Integrator , ODI 背景 原文 https://www.cdata.com/kb/tech/postgresql-jdbc-odi.rst 正文 ETL PostgreSQL in Oracle Data Integrator This ......

德哥
2018/05/06
0
0
多平台向Postgresql 迁移

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

从前
2013/01/30
0
0
postgresql数据库连接池pgbouncer

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

从前
2013/06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql免安装版,服务无法启动没有抱任何错误

1.解压 2.新建my.ini [mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, e......

榴莲黑芝麻糊
47分钟前
0
0
Qt编写安防视频监控系统3-通道交换

一、前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟...

飞扬青云
47分钟前
0
0
如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
今天
5
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
今天
4
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部