发表于: 2018-03-01 23:38:23

1 802


今天做了什么:

POM (工程对象模型)

能够设置的配置:

project dependencies

plugins

goals

build profiles

project version

developers

mailing list


项目中有个默认的super POM,包含可被继承的默认配置。


然后看到这被通知小课堂=。=


接下来就看了下varchar和text区别:

varchar

变长字符串 0-65535 字节

varchar(M)中的M表示指定字符数

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

text&longtext

text 长文本数据 0-65 535字节(64kb)

longtext 极大文本数据 0-4 294 967 295字节(4GB)


varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字

text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入


- 编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。若定义的时候超过上述限制,则varchar字段会被强行转为text类型(应该是mysql5.0.3之前),并产生warning。

- 行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。


varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用longtext,最大能到4G。


以上。

没什么内容。。。


诚如师兄所说没啥内容。

于是打算延后,明天讲:

为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发生一次?


然后回到任务:在不关闭连接池的情况下,在Main函数里写1000个循环调用。

这里先去了解了下连接池是什么

  1. - 对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

为什么要用连接池?

传统jdbc创建MySQL连接代码

  1. String connUrl ="jdbc:mysql://your.database.domain/yourDBname";  
  2. Class.forName("com.mysql.jdbc.Driver");  
  3. Connection con =DriverManager.getConnection (connUrl); 

1.这里首先“DriverManager”检查并注册驱动。

2.“com.mysql.jdbc.Driver”在驱动中调用“connect(url…)”方法。

3.com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。

4.创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。

简单的获取一个连接,系统却要在背后做很多消耗资源的事情,大多时候,创建连接的时间比执行sql语句的时间还要长。

这里的servlet感觉又是另一个故事了。暂时不深看。

使用连接池后:


给我的感觉是,连接池像车站机场的公共充电站里自带的充电线。

电源连接数据线,把连接手机的那头都放外面,其他封成黑箱。而不用抓着充电器四处找插座,也避免了插座经常被拔插会导致的潜在问题。

不过这个没有数据传输。。。


需要注意的问题

1、并发问题

java语言自带对并发的支持

2、事务处理

我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。

我们知道当2个线程公用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。

3、连接池的分配与释放

连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他(如何能找到最合适的连接文章将在关键议题中指出);如果没有就抛出一个异常给用户,List中连接是否可以被分配由一个线程来专门管理。

4、连接池的配置与维护

连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConnection)和最大连接数(maxConnection)等参数来控制连接池中的连接。比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。

如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。


连接池有几种:tomcat、dbcp、c3p0

tomcat默认用的是dbcp,而c3p0有自动回收空闲连接功能。

spring开发推荐dbcp一同使用,我就先用dbcp尝试。

使用dbcp需要导入

pom配置:

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-dbcp2</artifactId>
   <version>2.1.1</version>
</dependency>

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
   <version>2.2</version>
</dependency>

配置dbcp.properties

编写Utils类

然后就可以在应用中获取连接。

不过mybatis使用xml文件配置连接池。

怎么跟mybatis结合还需要看看。

明天打算做什么:

mybatis与dbcp的结合

小课堂

问题:

在想通过pom加载依赖包时发现不知道确切的groupId、artifactId、version

找到了一个网站可以查找:http://maven.outofmemory.cn/

收获:

连接池的概念。


返回列表 返回列表
评论

    分享到