使用Navicat 迁移 PostgreSQL 数据

需求是:将数据复制到另一个schema里,且owner也变更。

 

使用Navicat,右键数据源schema,转储SQL文件。生成的sql文件需要修改,比如修改owner,修改schema等等。

右击目标schema,运行SQL文件。

 

Navicat还是非常强大的。

PostgreSQL权限相关学习笔记

PG数据安全我觉得可以从两方面管理:

一是连接配置方面,可以修改pg_hba.conf,来限制某个数据库、某个用户可以访问的host、port等;

二是从数据库权限方面,来限制访问某个schema数据。

role与user:对于PostgreSQL来说,这是完全相同的两个对象。

区别是role不具有缺省的login权限。

#切换到postgres
su - postgres

#执行psql
psql

#创建用户
CREATE USER tsbe ENCRYPTED PASSWORD 'tsbepw';

#创建数据库
CREATE DATABASE tsbe OWNER tsbe;

#------------
#若报Must Be Member Of Role “Xxx”
GRANT xxRole TO currentLoginRole;
#------------

#将数据库的所有权限都赋予user(这步好像可以不执行)
GRANT ALL PRIVILEGES ON DATABASE tsbe TO tsbe;

\q

exit

#创建Linux用户,与新建的用户同名
sudo adduser tsbe
sudo passwd tsbe

#以tsbe的身份连接数据库tsbe
su - tsbe
psql -d tsbe

#------------
#若报Could Not Connect To Server: No Such File Or Directory Is The Server Running Locally And Accepting Connections On Unix Domain Socket “/Var/Run/Postgresql/.S.PGSQL.5432”?
#发修改环境变量增加PGPORT
cd ~/
touch .bash_profile
vi .bash_profile

#增加
PGPORT=xxx
export PGPORT

#保存后,需继续执行如下命令
source .bash_profile

#这样就增加了PGPORT变量,可以echo查看
echo $PGPORT
#------------


DB实例与schema: 模式是数据库实例的逻辑分割。

官方建议是这样的:在管理员创建一个具体数据库后,应该为所有可以连接到该数据库的用户分别创建一个与用户名相同的模式,然后,将search_path设置为”$user”(即缺省模式为与用户名相同的模式),这样,任何当某个用户连接上来后,会默认将查找或者定义的对象都定位到与之同名的模式中。这是一个好的设计架构。

#创建一个tsbe,并且设置所属用户为tsbe
create schema tsbe authorization tsbe;
#设置允许访问ip
vi /var/lib/pgsql/10/data/pg_hba.conf

host    tsbe    tsbe                    0.0.0.0/0               md5

#重启数据库
systemctl restart postgresql-10.service

参考:

https://www.cnblogs.com/xxfcz/p/6483892.html

https://my.oschina.net/liuyuanyuangogo/blog/497272

https://blog.csdn.net/su377486/article/details/80672867

CentOS修改时区

# timedatectl list-timezones |grep Shanghai    #查找中国时区的完整名称
Asia/Shanghai
# timedatectl set-timezone Asia/Shanghai    #其他时区以此类推
# date    #查看当前日期时间

 

参考

https://www.cnblogs.com/st-jun/p/7737188.html

解决PG创建数据库报must be member of role “xxx”问题

在创建数据库时指定owner,或修改数据库owner时,报must be member of role “xxx”

解决办法:

GRANT xxRole TO currentLoginRole;

其中currentLoginRole是当前登录数据库的用户

参考:

https://stackoverflow.com/questions/26684643/error-must-be-member-of-role-when-creating-schema-in-postgresql

 

 

解决修改PG端口后psql -U postgres报could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?问题

#修改端口
vi /xxxx/pgsql/10/data/postgresql.conf

#修改port = xxx,然后重启pg

#发现报标题所示的错误。需修改环境变量增加PGPORT

cd ~/
touch .bash_profile
vi .bash_profile

#增加
PGPORT=xxx
export PGPORT

#保存后,需继续执行如下命令
source .bash_profile

#这样就增加了PGPORT变量,可以echo查看
echo $PGPORT

 

参考:

https://www.cnblogs.com/space-place/p/5257127.html

https://www.jianshu.com/p/1bc529a4e69c

 

PostgreSQL数据库MyBatis insert返回自增主键

<insert id="save" parameterType="com.xxx.xxx.xxDo" useGeneratedKeys="true" keyProperty="XXKey">
   insert into "table_name" ...
</insert>

在java端调用save后,xxDO.getXXKey 即可取到自增主键的值。

参考:

https://www.cnblogs.com/Orange42/p/6207036.html

Java中使用synchronized锁定字符串

synchronized (someString){
    //xxxx
}

如果someString是动态生成的,则无法锁住,因为虽然字符串内容是相同的,但是不是同一个字符串对象。

解决办法是改成这样

synchronized (someString.intern()){
    //xxxx
}

String的intern()方法可以使得内容一样的字符串,指向同一个内存地址

java6中字符串池是固定大小,java7、8是可修改大小。

java7是1009,java8是25k-50k

参考:

https://blog.csdn.net/u014653197/article/details/76177277

http://silencegg.iteye.com/blog/2069267

 

SpringBoot Mybatis事务

application增加注解

@EnableTransactionManagement

service或方法增加注解

@Transactional

这样该方法如果中途异常,则回滚。

默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。

需要注意的是,直到方法执行完成之前,对数据库的修改并未生效,方法执行完成后,数据库操作才生效。

如果方法中有异步操作,则异步操作里的数据库操作不在事务内,直接生效。

参考:

https://www.cnblogs.com/kangoroo/p/8192503.html

https://blog.csdn.net/wohaqiyi/article/details/72895983

http://www.cnblogs.com/xusir/p/3650522.html

关于checked异常、unchecked异常:

https://blog.csdn.net/qq_14982047/article/details/50989761

SQL学习笔记

postgresql 判断是否为空 is null,is not null。

select * from student where name is null;
select * from student where name is not null;

 

union与union all的区别

union:对两个结果集进行并集操作,去掉重复行,同时进行默认规则的排序;
union all:对两个结果集进行并集操作,包括重复行,不进行排序;

 

coalesce

返回参数中的第一个非空表达式(从左向右)

select coalesce(null,2,3); // Return 2
select coalesce(null,null,3); // Return 3
select coalesce(1,2,3); // Return 1

 

 

 

Unity Roll-a-ball 学习笔记

官网的roll a ball视频教程前几节基本是介绍Unity基础操作。

教程的文本内容,可以参考:

https://www.jianshu.com/p/6e4b0435e30e

https://www.jianshu.com/p/97b630a23234

对于文中没写到的以及自己的一些理解,记录在这里。

 

Update、FixedUpdate、LateUpdate个人理解

Update游戏的每一帧调用,和机器有关,比如有的机器性能不好还能20多帧每秒,有的性能好的机器可以60帧

FixedUpdate和机器无关,固定的频率。处理物理逻辑的时候要把代码放在这里。

LateUpdate在Update之后调用。处理相机相关代码放在这里。

 

关于prefab个人理解

在project里创建一个PreFabs的文件夹。将Hierarchy里的Object拖到PreFabs里,就创建了这个Object的prefab。

如果拖到其他文件夹,也会创建prefab。猜测只要是将Hierarchy里的Object拖到Project里,就会创建他的prefab。

选择Object,ctrl + D可以Duplicate,复制粘贴。

选择其中的一个Object修改,再点击Inspector里的Prefab的Apply,则会修改prefab。

 

关于static collider、dynamic collider、standard rigid body、kinematic rigid body个人理解

写好代码后,Player(球)滚动时触碰到方块,方块并没有消失,而是像墙一样碰撞,是因为Unity物理系统不允许两个Collider(碰撞体)重合(除非已经重合的物体),所以需要设置方块为trigger。

设置完trigger后运行游戏,Player可以收集球了,看起来很完美,但是这样做会有个性能问题:

Unity的优化算法会将所有static collider(静态碰撞体)计算数据缓存,如果static collider移动、旋转、缩放的话,Unity会重新计算所有static collider数据并更新缓存。游戏中方块是static collider,而且每一帧都在旋转,所以会影响性能。

rigid body(刚体)是dynamic collider,不参与碰撞数据缓存。所以解决方案是将方块设置成rigid body。但是设置完之后,发现方块掉下去了,因为方块是trigger。

解决方法是将方块设置成kinematic rigid body。

kinematic rigid body不受物理影响,只受transform影响(移动、旋转、缩放),可以用于移动平台、带有动画的trigger。

总结起来就是:

static collider不会移动,像是墙、地板;

dynamic collider可以移动,且有rigid body。

standard rigid body通过physics forces移动;

kinematic rigid body通过transform移动。