Gordon Li commited on
Commit
be09ab2
·
1 Parent(s): 117ae8e

SQL Performance tuned

Browse files
Files changed (1) hide show
  1. AirbnbMapVisualiser.py +23 -8
AirbnbMapVisualiser.py CHANGED
@@ -14,6 +14,15 @@ class AirbnbMapVisualiser:
14
  'password': '7033',
15
  'dsn': 'imz409.ust.hk:1521/imz409'
16
  }
 
 
 
 
 
 
 
 
 
17
  self.tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
18
  self.traffic_manager = TrafficSpotManager(self.connection_params)
19
 
@@ -29,9 +38,11 @@ class AirbnbMapVisualiser:
29
  self.cached_listings = {}
30
 
31
  def get_all_neighborhoods(self):
 
32
  try:
33
- with oracledb.connect(**self.connection_params) as conn:
34
- cursor = conn.cursor()
 
35
  cursor.execute("""
36
  SELECT DISTINCT NEIGHBOURHOOD
37
  FROM airbnb_master_data
@@ -43,15 +54,17 @@ class AirbnbMapVisualiser:
43
  except Exception as e:
44
  print(f"Database error getting neighborhoods: {str(e)}")
45
  return []
 
 
46
 
47
  def get_neighborhood_listings(self, neighborhood):
48
- # Check if listings are already cached
49
  if neighborhood in self.cached_listings:
50
  return self.cached_listings[neighborhood]
51
-
52
  try:
53
- with oracledb.connect(**self.connection_params) as conn:
54
- cursor = conn.cursor()
 
55
  cursor.execute("""
56
  SELECT m.ID, m.NAME, m.HOST_NAME, m.NEIGHBOURHOOD,
57
  m.LATITUDE, m.LONGITUDE, m.ROOM_TYPE, m.PRICE,
@@ -59,7 +72,7 @@ COUNT(r.LISTING_ID) as NUMBER_OF_REVIEWS, m.REVIEWS_PER_MONTH,
59
  m.MINIMUM_NIGHTS, m.AVAILABILITY_365
60
  FROM airbnb_master_data m
61
  LEFT JOIN airbnb_reviews_data r ON m.ID = r.LISTING_ID
62
- WHERE m.LATITUDE IS NOT NULL AND m.LONGITUDE IS NOT NULL AND NEIGHBOURHOOD = :neighborhood
63
  GROUP BY m.ID, m.NAME, m.HOST_NAME, m.NEIGHBOURHOOD,
64
  m.LATITUDE, m.LONGITUDE, m.ROOM_TYPE, m.PRICE,
65
  m.REVIEWS_PER_MONTH, m.MINIMUM_NIGHTS, m.AVAILABILITY_365
@@ -72,6 +85,8 @@ m.REVIEWS_PER_MONTH, m.MINIMUM_NIGHTS, m.AVAILABILITY_365
72
  except Exception as e:
73
  print(f"Database error: {str(e)}")
74
  return []
 
 
75
 
76
  def get_listing_reviews(self, listing_id):
77
  try:
@@ -85,7 +100,7 @@ m.REVIEWS_PER_MONTH, m.MINIMUM_NIGHTS, m.AVAILABILITY_365
85
  ELSE COMMENTS
86
  END as COMMENTS
87
  FROM AIRBNB_REVIEWS_DATA
88
- WHERE LISTING_ID = :listing_id
89
  ORDER BY REVIEW_DATE DESC
90
  """, listing_id=str(listing_id))
91
  reviews = cursor.fetchall()
 
14
  'password': '7033',
15
  'dsn': 'imz409.ust.hk:1521/imz409'
16
  }
17
+ self.pool = oracledb.SessionPool(
18
+ user=self.connection_params['user'],
19
+ password=self.connection_params['password'],
20
+ dsn=self.connection_params['dsn'],
21
+ min=2,
22
+ max=5,
23
+ increment=1,
24
+ getmode=oracledb.SPOOL_ATTRVAL_WAIT
25
+ )
26
  self.tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
27
  self.traffic_manager = TrafficSpotManager(self.connection_params)
28
 
 
38
  self.cached_listings = {}
39
 
40
  def get_all_neighborhoods(self):
41
+ connection = self.pool.acquire()
42
  try:
43
+ cursor = connection.cursor()
44
+ cursor.prefetchrows = 50
45
+ cursor.arraysize = 50
46
  cursor.execute("""
47
  SELECT DISTINCT NEIGHBOURHOOD
48
  FROM airbnb_master_data
 
54
  except Exception as e:
55
  print(f"Database error getting neighborhoods: {str(e)}")
56
  return []
57
+ finally:
58
+ self.pool.release(connection)
59
 
60
  def get_neighborhood_listings(self, neighborhood):
61
+ connection = self.pool.acquire()
62
  if neighborhood in self.cached_listings:
63
  return self.cached_listings[neighborhood]
 
64
  try:
65
+ cursor = connection.cursor()
66
+ cursor.prefetchrows = 50
67
+ cursor.arraysize = 50
68
  cursor.execute("""
69
  SELECT m.ID, m.NAME, m.HOST_NAME, m.NEIGHBOURHOOD,
70
  m.LATITUDE, m.LONGITUDE, m.ROOM_TYPE, m.PRICE,
 
72
  m.MINIMUM_NIGHTS, m.AVAILABILITY_365
73
  FROM airbnb_master_data m
74
  LEFT JOIN airbnb_reviews_data r ON m.ID = r.LISTING_ID
75
+ WHERE m.LATITUDE IS NOT NULL AND m.LONGITUDE IS NOT NULL AND NEIGHBOURHOOD = :neighborhood AND ROWNUM <= 150
76
  GROUP BY m.ID, m.NAME, m.HOST_NAME, m.NEIGHBOURHOOD,
77
  m.LATITUDE, m.LONGITUDE, m.ROOM_TYPE, m.PRICE,
78
  m.REVIEWS_PER_MONTH, m.MINIMUM_NIGHTS, m.AVAILABILITY_365
 
85
  except Exception as e:
86
  print(f"Database error: {str(e)}")
87
  return []
88
+ finally:
89
+ self.pool.release(connection)
90
 
91
  def get_listing_reviews(self, listing_id):
92
  try:
 
100
  ELSE COMMENTS
101
  END as COMMENTS
102
  FROM AIRBNB_REVIEWS_DATA
103
+ WHERE LISTING_ID = :listing_id AND ROWNUM <= 50
104
  ORDER BY REVIEW_DATE DESC
105
  """, listing_id=str(listing_id))
106
  reviews = cursor.fetchall()