文档章节

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

harris2016
 harris2016
发布于 2016/06/15 10:05
字数 863
阅读 87
收藏 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......

德哥
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

没有更多内容

加载失败,请刷新页面

加载更多

简单模仿配置文件的反射机制

//Student类 public class Student { public void love() { System.out.println("python"); } } //Tesy类 public class Tesy { public static void main(String[] args) throws Exceptio......

南桥北木
12分钟前
1
0
你真的需要了解一下CSS变量 var()的用法

当Web项目变得越来越大时,他的CSS会变得像天文数字那么大而且还变得混乱。为了帮助我们解决这个问题,新的CSS变量很快就会出现在主流浏览器中,它让开发人员能够重用并轻松编辑重复出现的C...

前端小攻略
15分钟前
0
0
嵌入式应用选择合适的微控制器

为嵌入式应用选择微控制器有几个原因,即低成本,高集成度,增加可靠性,节省空间等。 准备所需硬件接口列表使用微控制器的基本硬件框图,准备一份微控制器需要支持的所有外设接口的列表。微...

linux-tao
58分钟前
5
0

中国龙-扬科
今天
2
0
使用apicloud开发移动端APP,IOS list页面滚动卡顿解决记录

给内容容器添加样式:-webkit-overflow-scrolling:touch; -webkit-overflow-scrolling:属性控制元素在移动设备上是否使用滚动回弹效果. auto:使用普通滚动, 当手指从触摸屏上移开,滚动会立即...

万建宁
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部