2、环境搭建与配置:Python/Java环境准备、数据库驱动安装、ORM框架初始化配置、连接池设置
说实话,很多同学学ORM框架,上来就写代码。结果跑起来全是坑。我见过太多人卡在环境配置这一步,一卡就是半天。今天咱们就把这事彻底捋清楚。
2.1 Python/Java环境准备
先说Python。我个人习惯用pyenv管理版本。为什么?因为项目多了你就知道,Python 3.6、3.8、3.10各有各的兼容问题。你想想看,一个ORM框架可能只支持某个Python版本范围。
# 安装pyenv(macOS/Linux)
curl https://pyenv.run | bash
# 安装指定Python版本
pyenv install 3.10.12
# 创建虚拟环境
python -m venv orm_env
source orm_env/bin/activate # Linux/Mac
orm_env\Scripts\activate # Windows
小提示:我建议Python版本选3.9以上。SQLAlchemy 2.0已经全面拥抱异步,低版本Python跑起来会有兼容警告。
Java这边呢?JDK 11是底线。Spring Boot 3.x已经要求JDK 17了。我曾经在一个老项目里用JDK 8跑Hibernate 6,结果一堆注解不识别,折腾了两天。
# 检查Java版本
java -version
# 推荐使用sdkman管理JDK版本
curl -s "https://get.sdkman.io" | bash
sdk install java 17.0.9-tem
2.2 数据库驱动安装
驱动这东西,说白了就是ORM和数据库之间的翻译官。选错了版本,连不上数据库是常事。
Python生态:
- MySQL:mysqlclient 或 pymysql(纯Python,兼容性好)
- PostgreSQL:psycopg2(推荐)或 asyncpg(异步场景)
- SQLite:内置,无需额外安装
# pip安装驱动
pip install pymysql
pip install psycopg2-binary # 二进制版本,免编译
pip install asyncpg
注意:psycopg2的源码安装需要编译,很多新手在这卡住。直接用psycopg2-binary省心。但生产环境我建议还是编译安装,性能更好。
Java生态:
Maven或Gradle里加依赖就行。嗯,这里要注意版本对应关系。
<!-- Maven依赖示例 -->
<!-- MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<!-- PostgreSQL驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.1</version>
</dependency>
2.3 ORM框架初始化配置
框架初始化是重头戏。我见过最离谱的配置,是把数据库密码直接写在代码里。别笑,真事。
Python:SQLAlchemy 2.0 配置示例
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
# 数据库连接URL
DATABASE_URL = "mysql+pymysql://user:password@localhost:3306/mydb"
# 创建引擎
engine = create_engine(
DATABASE_URL,
echo=True, # 打印SQL日志,调试用
pool_size=5,
max_overflow=10
)
# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 声明基类
Base = declarative_base()
核心要点:echo=True只在开发环境开。生产环境关掉,不然日志能把磁盘撑爆。我吃过这个亏。
Java:Spring Boot + JPA/Hibernate 配置
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: user
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update # 开发用update,生产用validate或none
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
format_sql: true
为什么ddl-auto要分环境?update会在启动时自动建表改表,生产环境万一误操作,表结构就乱了。我曾经在生产环境忘了改配置,结果一个字段类型被自动改了,数据全乱套。
2.4 连接池设置
连接池是ORM性能的关键。说白了,就是复用数据库连接,避免每次请求都新建连接。你想想看,建一次连接要三次握手,还要认证,开销多大。
Python:SQLAlchemy连接池参数
| 参数 | 说明 | 推荐值 |
|---|---|---|
| pool_size | 连接池大小 | 5-10 |
| max_overflow | 超出pool_size的最大连接数 | 10-20 |
| pool_timeout | 等待连接的超时时间(秒) | 30 |
| pool_recycle | 连接回收时间(秒) | 3600 |
# 生产环境推荐配置
engine = create_engine(
DATABASE_URL,
pool_size=10,
max_overflow=20,
pool_timeout=30,
pool_recycle=3600,
pool_pre_ping=True # 每次使用前检查连接是否有效
)
经验之谈:pool_pre_ping=True一定要开。不然数据库重启后,连接池里的旧连接全废了,请求会报错。我因为这个被半夜叫起来过。
Java:HikariCP连接池配置
Spring Boot 2.x默认用HikariCP,性能极好。别换别的了。
# application.yml
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
connection-test-query: SELECT 1
为什么connection-test-query要写SELECT 1?这是最轻量的数据库心跳检测。有些ORM用SELECT 1 FROM DUAL,那是Oracle的写法。MySQL和PostgreSQL直接用SELECT 1就行。
避坑指南
我曾经在一个高并发项目里,连接池设了100。结果数据库扛不住,直接挂了。后来发现,连接池不是越大越好。数据库能同时处理的连接数是有限的。一般建议:
- 小型应用:5-10个连接
- 中型应用:10-20个连接
- 大型应用:20-50个连接,配合读写分离
还有一点,连接池的max-lifetime要小于数据库的wait_timeout。不然连接被数据库端断开,应用还不知道,一用就报错。嗯,这个坑我踩过两次才记住。
好了,环境搭建这块就这些。配置对了,后面写代码才顺心。下一章咱们开始讲ORM的核心——模型定义与映射。