Skip to content

Commit 7e2b12a

Browse files
committed
Fix bugs: cause by autocommit=False.
1 parent 8960d85 commit 7e2b12a

File tree

3 files changed

+111
-5
lines changed

3 files changed

+111
-5
lines changed

example_flask_mybatis.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
from flask import Flask
2+
import mysql.connector
3+
from mybatis import Mybatis
4+
import orjson as json
5+
import functools
6+
7+
app = Flask(__name__)
8+
9+
10+
# 连接到 MySQL 数据库
11+
conn = None
12+
mb = Mybatis(conn, "mapper", cache_memory_limit=50*1024*1024)
13+
connection_error = False
14+
error_string = ""
15+
16+
def make_connection_and_mybatis():
17+
global conn
18+
global mb
19+
global connection_error
20+
global error_string
21+
22+
if conn is None:
23+
try:
24+
conn = mysql.connector.connect(
25+
host="localhost",
26+
user="mybatis",
27+
password="mybatis",
28+
database="mybatis",
29+
autocommit=True
30+
)
31+
mb.conn = conn
32+
33+
return True
34+
35+
except Exception as e:
36+
connection_error = True
37+
error_string = str(e)
38+
return False
39+
else:
40+
try:
41+
if connection_error:
42+
conn.reconnect(3, 3)
43+
connection_error = False
44+
45+
if mb.conn is None:
46+
mb.conn = conn
47+
return True
48+
except Exception as e:
49+
connection_error = True
50+
error_string = str(e)
51+
return False
52+
53+
54+
@mb.SelectOne("SELECT * FROM fruits WHERE id=#{id}")
55+
def select_one(id:int):
56+
pass
57+
58+
@mb.SelectMany("SELECT * FROM fruits")
59+
def select_many():
60+
pass
61+
62+
@mb.Insert("INSERT INTO fruits (name,category,price) VALUES ('Candy', 'C', 500)")
63+
def insert():
64+
pass
65+
66+
def mysql_auto_reconnect(func):
67+
@functools.wraps(func)
68+
def wrapper(*args, **kwargs):
69+
global connection_error
70+
try:
71+
ret = make_connection_and_mybatis()
72+
if ret is False:
73+
return error_string, 500
74+
75+
76+
77+
ret = func(*args, **kwargs)
78+
return ret, 200
79+
80+
except mysql.connector.errors.Error as e:
81+
connection_error = True
82+
return str(e), 500
83+
except Exception as e:
84+
return str(e), 500
85+
86+
#wrapper.__name__ = func.__name__
87+
#wrapper.__doc__ = func.__doc__
88+
89+
return wrapper
90+
91+
92+
@app.route('/')
93+
@mysql_auto_reconnect
94+
def hello():
95+
ret = select_many()
96+
return json.dumps(ret)
97+
98+
99+
@app.route('/insert')
100+
@mysql_auto_reconnect
101+
def do_insert():
102+
ret = insert()
103+
return json.dumps(ret)
104+
105+
if __name__ == "__main__":
106+
app.run(debug=True)

mybatis/cache.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ def put(self, raw_key:CacheKey, value: Any):
4343
node = CacheNode(key, json.dumps(value))
4444
node.memory_usage = asizeof.asizeof(node.key) + asizeof.asizeof(node.value)
4545

46-
# print("====>", node.memory_usage)
47-
4846
while self.memory_used + node.memory_usage >= self.memory_limit:
4947
to_remove_node = self.list.tail.prev
5048
if to_remove_node is not self.list.head:
@@ -57,7 +55,8 @@ def put(self, raw_key:CacheKey, value: Any):
5755
if self.memory_used + node.memory_usage > self.memory_limit:
5856
return
5957

60-
self.table[key] = node
58+
node.timestamp = int(time.time() * 1000)
59+
self.table[node.key] = node
6160

6261
self.list.move_to_head(node)
6362

@@ -70,8 +69,9 @@ def get(self, raw_key: CacheKey) -> Optional[Any]:
7069

7170
node = self.table[key]
7271
current_time_ms = int(time.time() * 1000)
72+
# print("delta:",current_time_ms - node.timestamp, "self.max_live_ms:", self.max_live_ms)
7373
if current_time_ms - node.timestamp > self.max_live_ms:
74-
del self.table[node.key]
74+
del self.table[key]
7575
self.list.remove(node)
7676
self.memory_used -= node.memory_usage
7777
return None

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='mybatis',
5-
version='0.0.13',
5+
version='0.0.14',
66
description='A python ORM like mybatis.',
77
long_description=open('README.md').read(),
88
long_description_content_type='text/markdown', # 如果你使用的是Markdown格式的README

0 commit comments

Comments
 (0)